Java反射的简单使用

更新时间:2020-06-24 13:46:19 点击次数:1096次
实现反射,获取Class对象的三种方式:

// 方法一
User user = new User();
Class class1 = user.getClass();
// 方法二
Class<User> class2 = User.class;
// 方法三
try {
    Class class3 = Class.forName("test.User");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}


 从上面的运行结果可以看出来,在运行期间一个类只会产生一个 Class 对象。

通过方射获取类信息:
获取 User 类的变量:

public class User {
 
    public Long id;
    protected String name;
    String sex;
    private Integer age;
}
 定义四个不同访问权限的变量。

访问权限 当前类 同一包 子类 其他包
权限修饰词:public
权限修饰词:protected ×
默认 × ×
权限修饰词:private × × ×
获取公有的变量:getFields



Class userClass = Class.forName("test.User");
Field[] fields = userClass.getFields();
for(int i = 0; i < fields.length; i++) {
    System.out.println(fields[i]);
}


获取所有的变量:getDeclaredFields



Class userClass = Class.forName("test.User");
Field[] fields = userClass.getDeclaredFields();
for(int i = 0; i < fields.length; i++) {
    System.out.println(fields[i]);
}
 

调用:





 在User中定义一个默认的构造方法:

    public User() {
        this.id = 1L;
        this.name = "张三";
        this.sex = "男";
        this.age = 18;
    }
 获取公有变量:

    Field field = userClass.getField("id");
    Object object = userClass.getConstructor().newInstance();
    field.set(object,1234L);
    User user = (User)object;
    System.out.println(user.getId());


获取私有变量:



这样发现会报错,无法访问私有变量。



加上field.setAccessible(true);

    Field field = userClass.getDeclaredField("age");
    Object object = userClass.getConstructor().newInstance();
    field.setAccessible(true);
    field.set(object,22);
    User user = (User)object;
    System.out.println(user.getAge());


 构造方法:
获取公有构造方法: 



获取所有构造方法: 

 

    public User() {
        this.id = 1234L;
        this.name = "张三";
        this.sex = "男";
        this.age = 18;
    }
 
    private User(String name) {
        this.name = name;
    }
调用: 

Class userClass = Class.forName("test.User");
// 私有
Constructor privateCon = userClass.getDeclaredConstructor(String.class);
privateCon.setAccessible(true);
User priUser = (User) privateCon.newInstance("aaaa");
System.out.println(priUser.getName());
// 公有
Constructor publicCon = userClass.getConstructor();
User pubUser = (User) publicCon.newInstance();
System.out.println(pubUser.getName());


 普通方法:
获取公有方法: 



获取所有方法:  



    public User() {
        this.id = 1234L;
        this.name = "张三";
        this.sex = "男";
        this.age = 18;
    }
 
    // 私有
    private void getAge() {
        System.out.println(age);
    }
    
    // 公有
    public void getName() {
        System.out.println(name);
    }
调用:

public static void main(String[] args) {
    try {
        Class userClass = Class.forName("test.User");
        // 创建新实例
        Object obj = userClass.getConstructor().newInstance();
        
        // 公有
        Method m1 = userClass.getMethod("getName");//参数1:方法名
        m1.invoke(obj);
 
        // 私有
        Method m2 = userClass.getDeclaredMethod("getAge");//参数1:方法名
        m2.setAccessible(true);//解除私有
        m2.invoke(obj);
 
    } catch (Exception e) {
        e.printStackTrace();
    }
}


本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

回到顶部
嘿,我来帮您!