Java 动态特性一:反射(reflect)

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
下面是反射机制用到的基本的代码:

  • ReflectTest 测试反射机制的类
  • User 实体类
package com.test.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 测试java反射
 * @author zhb
 *
 */
public class ReflectTest {

    private static void test() throws Exception {
        
        String path = "com.test.reflect.User";
        
        // 获取类信息的方式有三种,三种方式获取的类对象相同;clazz是以后操作的关键
        // 第一种方式
        Class clazz = Class.forName(path);
        // 第二种方式
        Class clazz1 = User.class;
        // 第三种方式
        User u = new User();
        Class clazz2 = u.getClass();
        
        System.out.println(clazz.hashCode());
        System.out.println(clazz1.hashCode());
        System.out.println(clazz2.hashCode());
        
        // 获取类名称包名+类名; 
        String className = clazz.getName(); // clazz.getSimpleName();    // 只有类名
        
        // 获取clazz构造方法
        // 利用无参的构造方法创建对象user, 比较常用
        User user = (User) clazz.newInstance(); 
        user.setName("张三");
        // 获取有参的构造方法
        Constructor<User> constructor = clazz.getConstructor(new Class[]{int.class, String.class});
        // 根据获取的有参的构造方法创建一个对象
        User user2 = constructor.newInstance(1001, "李四");
        System.out.println(user.getName()+"---------"+user2.getName());
        
        
        // 对属性的操作
        // 这样只能获取public的属性
        Field[] fields = clazz.getFields(); 
        // 获取所有的属性  declared:公告的
        Field[] fields1 = clazz.getDeclaredFields();  
        // 根据属性的名字获取属性
        Field field = clazz.getDeclaredField("name");
        // 跳过检查,不然给私有变量赋值会报错,也会提高效率,建议使用
        field.setAccessible(true); 
        field.set(user, "王五");
        System.out.println(user.getName());
        
        
        // 对方法的操作
        // 获取所有的公共方法
        Method[] methods = clazz.getMethods();
        // 获取所有的方法
        Method[] methods1 = clazz.getDeclaredMethods();
        // 根据指定的名字获取方法, public类型的方法
        Method method = clazz.getMethod("hello", String.class);
        // 跳过验证 ,提高效率
        method.setAccessible(true);
        Object result = method.invoke(user, "调用方法");
        System.out.println(result);
    }


    public static void main(String[] args) throws Exception {
        test();
    }

}

package com.test.reflect;

public class User {
    
    private int id;
    private String name;
    
    // 无参的构造方法,容易被忘记
    public User(){
        
    }
    
    //有参的构造方法
    public User(int id, String name){
        this.id = id;
        this.name = name;
    }
    
    // 类中一个普通的方法
    public String hello(String name){
        System.out.println("hello:"+ name);
        return "方法调用成功";
    }
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,534评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,638评论 18 399
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 178,893评论 25 709
  • 平凡的我,活在平凡的世界里。可是生活却不是那么平淡。 我得罪了上司,最后被解雇。后来在朋友的劝说下,我回到了从前那...
    小黑球222阅读 431评论 0 0
  • “咚咚咚”一阵急促的敲门声惊醒了还在睡梦中的李老头。 李老头不情愿地掀开被子,抓了件外套披上,趿着拖鞋边走边喊道:...
    莉莉安_7335阅读 924评论 0 1

友情链接更多精彩内容