Java反射

Java反射:Class获取与成员操作

目录

  1. 测试基础实体类
  2. 获取Class的三种方式
  3. 获取fields,methods,constructors
  4. 获取某一个field或mehtod,constructor
  5. 根据clazz获取实例对象
  6. Field常用操作方法
  7. method 相关操作
  8. constructor相关操作

测试基础实体类

public class UserFather {
    public String fatherName;
    private String fatherPassword;

        省略:get和set.......

}

public class User extends UserFather {
    private String userName;
    private String password;
    private Integer age;

        省略:get和set.......

}

获取Class的三种方式

//1.类名.class()

Class<User> userClass1 = User.class;


//2.Class.forName("类的全路径")

Class<?> userClass2 = Class.forName("com.blog.reflect.test.User");


//3.对象.getClass()
 

Class<? extends User> userClass3 = new User().getClass()

获取fields,methods,constructors

构造方法是不能被继承的。

Field[] fields = clazz.getFields();//获取的是本类及其继承的父类的所有非private的属性
Field[] declaredFields = clazz.getDeclaredFields(); //获取的是本类所有声明的属性包括public,private.....
Method[] methods = clazz.getMethods();//获取的是本类及其继承的父类的所有非private的方法
Method[] declaredMethods = clazz.getDeclaredMethods();//获取的是本类所有声明的方法包括public,private.....
Constructor<?>[] constructors = clazz.getConstructors(); //获取的是本类及其继承的父类的所有非private的构造方法
Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors(); //获取的是本类所有的构造方法

获取某一个field或mehtod,constructor

Field fatherName = clazz.getField("fatherName");//获取的是本类及其继承的父类的指定名称的非private的属性
Field userName = clazz.getDeclaredField("userName");//获取的是本类指定属性包括public,private.....
Method getFatherName = clazz.getMethod("getFatherName", null);//同上
Method getAge = clazz.getDeclaredMethod("getAge", null);//同上 
Method setAge = clazz.getDeclaredMethod("setAge", Integer.class);//获取set方法
Method setUserName = clazz.getDeclaredMethod("setUserName", String.class);//获取set方法
Constructor<User> constructor = clazz.getConstructor(String.class);//同上 
Constructor<User> declaredConstructor = clazz.getDeclaredConstructor(String.class);//同上 

根据clazz获取实例对象

clazz.newInstance();
 

Field常用操作方法

Class<User> clazz = User.class;
Field field = clazz.getDeclaredField("userName");
field.getName();//userName
field.getType();//class java.lang.String
field.isAccessible();
field.setAccessible(true);
User user = clazz.newInstance();
field.set(user, "张三");//设置字段值
Object o = field.get(user);//获取字段值
System.out.println(o);

method 相关操作:

method.invoke(clazz.newInstance(), "NAME1", "name2");
method.getName();

constructor相关操作

Class<User> clazz = User.class;
clazz.newInstance();//调用无参构造方法创建实例
clazz.getDeclaredConstructor(String.class).newInstance("张三");
clazz.getDeclaredConstructor().newInstance();//调用无参构造方法创建实例

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值