Java反射的简单使用

实现反射,获取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();
    }
}

猜你喜欢

转载自blog.csdn.net/m_crayon/article/details/106753785
今日推荐