1.Java反射机制提供的功能
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判断任意一个类所具有的成员变量和方法
在运行时获取泛型信息
在运行时调用任意一个对象的成员变量和方法
在运行时处理注解
生成动态代理(AOP)
2.Class(反射基石)
方法名 | 功能说明 |
---|---|
static ClassforName(String name) | 返回指定类名name的Class对象 |
Object newInstance() | 调用缺省构造函数,返回Class对象的一个实例 |
getName() | 返回此Class对象所表示的实体 (类,接口,数组类或void) 的名称。 |
Class getSuperClass() | 返回当前Class对象的父类的Class对象 |
Class[] getinterfaces() | 获取当前Class对象的接口 |
ClassLoader getClassLoader() | 返回该类的类加载器 |
Constructorl] getConstructors() | 返回一个包含某些Constructor对象的数组 |
Method getMethod(String name, Class … T) | 返回一个Method对象,此对象的形参类型为paramType |
Field getDeclaredFields() | 返回Field对象的一个数组 |
2.1获取Class的方式
public class ReflectTest {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
Class clazz1 = User.class;
Class clazz2 = clazz1.getClass();
Class clazz3 = Class.forName("com.ldl.reflect.User");
}
}
2.2哪些类型可以有Class对象?
class:外部类,成员(成员内部类,静态内部类),局部内部类,匿名内部类
interface:接口
[] 数组
enum:枚举
annotation:注解@interface
primitive type:基本数据类型
void
2.3 获取运行时类的结构
public class ReflectTest2 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
Class clazz1 = User.class;
Class clazz2 = clazz1.getClass();
Class clazz3 = Class.forName("com.ldl.reflect.User");
//获取全类名
String name = clazz1.getName();
//获取类名
String simpleName = clazz1.getSimpleName();
//获取public类属性
Field[] fields = clazz1.getFields();
//获取全部类属性
Field[] declaredFields = clazz1.getDeclaredFields();
//获得指定属性的值
// Field id = clazz1.getField("id");
Field id = clazz1.getDeclaredField("id");
//获取本类及父类的public方法
Method[] methods = clazz1.getMethods();
//获取本类的所有方法
Method[] declaredMethods = clazz1.getDeclaredMethods();
//获得指定方法
Method method = clazz1.getMethod("getUsername", null);
//获得构造器
Constructor[] constructors = clazz1.getConstructors();
//获得全部构造器
Constructor[] declaredConstructors = clazz1.getDeclaredConstructors();
//获得指定构造器
Constructor constructor = clazz1.getConstructor();
//获得指定的构造器
Constructor declaredConstructor = clazz1.getDeclaredConstructor();
//接口
Class[] interfaces = clazz1.getInterfaces();
//注解
Annotation[] annotations = clazz1.getAnnotations();
//注解
// Annotation declaredAnnotation = clazz1.getDeclaredAnnotation(null);
User user = (User)clazz1.newInstance();
//通过反射调用方法
Method setUsername = clazz1.getDeclaredMethod("setUsername", String.class);
setUsername.invoke(user, "lilili");
System.out.println(user.getUsername());
User user2 = (User)clazz1.newInstance();
Field username = clazz1.getDeclaredField("username");
// 不能直接操作私有属性,需要关掉安全监测机制
username.setAccessible(true);
username.set(user2, "lilili222");
System.out.println(user2.getUsername());
}
}
class User {
private String id;
private String username;
private String password;
public User() {}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}