文章目录
反射
Java中主要由以下的类来实现Java反射机制(这些类都位于java.lang.reflect包中):
Class 对象是在加载类时由 Java 虚拟机自动构造
- Class类:代表一个类。
- Field类:代表类的成员变量(成员变量也称为类的属性)。
- Method类:代表类的方法。
- Constructor类:代表类的构造方法。
- Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
获取class
Class.forName() 常用
Hero.class
new Hero().getClass()
Class常用API
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes参数指定方法的参数类型。
getConstrutors():获得类的public类型的构造方法。
getConstrutor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。
Field 常用API
1、 public Class<?>getDeclaringClass()
返回表示类或接口的 Class 对象,该类或接口声明由此Field 对象表示的字段。
指定者:接口Member 中的getDeclaringClass
返回:表示声明底层成员的类的对象
2、publicStringgetName()
返回此Field 对象表示的字段的名称。
指定者:接口Member 中的getName
返回:底层成员的简单名称
3、public Class<?>getType() 返回一个Class 对象,它标识了此 Field 对象所表示字段的声明类型。
返回:标识此对象所表示字段的声明类型的 Class 对象
4、public StringtoString()
返回一个描述此 Field 的字符串。
格式是:该字段(如果存在的话)的访问修饰符,后面跟着字段类型和一个空格,再后面是声明该字段的类的完全限定名,后面跟着一个句点,最后是字段的名称。例如:
5、public boolean equals(Object obj)
将此 Field 与指定对象比较。如果对象是相同的,则返回 true。如果由相同的类声明并且具有相同的名称和类型,那么这两个Field 对象是相同的。
覆盖:类 Object 中的equals
参数:obj - 要与之比较的引用对象。
返回:如果此对象与 obj 参数相同,则返回 true;否则返回false。
Mehted 常用API
1、Method对象的获取 方法所在类的类对象.getMethod(String methodName,Class[] argsClass);
获取方法Method对象的参数是方法名和方法的参数类。
2、method.invoke(方法所在类的对象,Object[] args);
执行方法参数:方法所在类的实例对象,和实际参数的Object数组;
如果该方法是静态方法,则方法所在类的对象可以为null
PropertyDescriptor 属性描述器
PropertyDescriptor对象是位于java.beans包下的工具类,顾名思义为属性描述器,通常我们用于通过反射获取对象方法的时候,下面来看一下常用的用法吧!
创建
public PropertyDescriptor(String propertyName, Class<?> beanClass)
属性名字,Class对象
常用api
prop.getName() 获取属性编码
prop.getReadMethod() 获取get方法
prop.getWriteMethod() 获取set方法
prop.getPropertyType() 获取属性的定义类型
反射常用操作
创建对象
1.获取类对象 Class class = Class.forName("pojo.Hero");
2.获取构造器对象 Constructor con = clazz.getConstructor(形参.class);
Object objectCopy=classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
3 获取对象 Hero hero =con.newInstance(实参);
获取成员变量并使用
1.获取HeroPlus类的对象
2. 获取属性 Field f1 = h.getDeclaredField("属性名")
3. 修改属性 f1.set(h,实参),注意这里的h是对象,不是类对象
执行对象方法
// invoke第一个参数表示执行哪个对象的方法,剩下的参数是执行方法时需要传入的参数
method = clazz.getDeclaredMethod("setAge", Integer.class);
Object obje = clazz.newInstance();
method.invoke(obje,2);
获取对象字段值
//通过Class对象.getDeclaredField(name)获取字段对象
Field declaredField = paramtertypeClass.getDeclaredField(content);
//暴力访问 获取值
declaredField.setAccessible(true);
//Field.get(Objcet) 来获取到objcet里面field字段的值
Object o = declaredField.get(user);
赋值给对象
User user =new User();
PropertyDescriptor pro = new PropertyDescriptor("id",User.Class);
Mehted wri = pro.getWriteMethod()
writeMethod.invoke(o,value);