反射机制 – Reflection

Reflection API
Class

通过反射获取类的Class对象
Class c1 = Class.forName("com.chen.User");
|
- 一个类在内存中只有一个Class对象
- 一个类被加载后,类的整个结构都会被封装在Class对象中


获取Class类实例
public class reflection02 { public static void main(String[] args) throws ClassNotFoundException { Person person = new Student(); } }
class Person{}
class Student extends Person{}
class Teacher extends Person{}
|
.class属性

Class对象

Class c1 = Object.class; Class c2 = Comparable.class; Class c3 = String[].class; Class c4 = int[][].class; Class c5 = Override.class; Class c6 = ElementType.class; Class c7 = Integer.class; Class c8 = void.class; Class c9 = Class.class;
|
.getClass()方法

Class c = person.getClass();
|
.forName()

Class c = Class.forName("com.chen.Student");
|
Integer.Type
获取父类.getSuperclass()
Class c = c1.getSuperclass();
|
Java内存

类加载内存分析

类初始化
发生初始化
new
反射调用
Class.forName("com.chen.Student");
|

类加载器


获取类的运行时结构
Class c1 = Class.forName("com.chen.User");
|
获取类的名字
- getName:获得包名+类名
- getSimpleName:获得类名
c1.getName(); c1.getSimpleName()
|
获得类的属性
- getFields : 只能获取public属性
- getDeclaredFields:获取全部属性
Field[] fields = c1.getFields();
Field[] fields = c1.getDeclaredFields();
|
获得类的指定属性
Field name = c1.getDeclaredField("name");
|
获得类的方法
- getMethods:获得本类及其他父类的全部public方法
- getDeclaredMethods:获得本类的所有方法
Method[] methods = c1.getMethods();
Method[] methods = c1.getDeclaredMethods();
|
获得类的指定方法
Method getName = c1.getMethod("getName", null);
Method setName = c1.getMethod("setName", String.class);
|
获得构造器
- getConstructors:获得public构造器
- getDeclaredConstructors:获得全部构造器
Constructor[] constructors = c1.getConstructors();
Constructor[] constructors= c1.getDeclaredConstructors();
|
获取指定构造器
- getDeclaredConstructor:注意参数类型,否则实现重载
Constructor declaredConstructor = c1.getDeclaredConstructor(String.class, int.class, int.class);
|
动态创建对象执行方法

Class对象
Class c1 = Class.forName("com.chen.User");
|
创建类的对象
- newInstance:构造对象(默认含有无参构造器)
User user = (User)c1.newInstance();
|
- 使用构造器创建对象
- getDeclaredConstructor + newInstance
Constructor constructor = c1.getDeclaredConstructor(String.class, int.class, int.class);
User user2 = (User)constructor.newInstance("c",1,1);
|
调用指定方法

通过反射调用方法
User user3 = (User) c1.newInstance();
Method setName = c1.getDeclaredMethod("setName", String.class);
|

setName.invoke(user3,"辰呀");
|
通过反射操作属性
User user4 = (User) c1.newInstance(); Field name = c1.getDeclaredField("name");
|
关闭程序的安全检查

name.setAccessible(true); name.set(user4,"彭呀");
|
性能监测
- Sysem.currentTimeMills() 获取运行时间
long startTime = System.currentTimeMillis();
long endTime = System.currentTimeMillis();
|
性能:普通(new)> 关闭性能检测的反射调用 > 反射调用
反射操作泛型

public class Test1 {
public void test01(Map<String,User> map, List<User> list){ }
public Map<String,User> test02(){ System.out.println("test02"); return null; }
public static void main(String[] args) throws NoSuchMethodException { Method method = Test1.class.getMethod("test01", Map.class, List.class);
Type[] genericParameterTypes = method.getGenericParameterTypes(); for (Type genericParameterType : genericParameterTypes) {
if (genericParameterType instanceof ParameterizedType){ Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments(); for (Type actualTypeArgument : actualTypeArguments) {
} } }
method = Test1.class.getMethod("test02",null); Type genericReturnType = method.getGenericReturnType();
if (genericReturnType instanceof ParameterizedType){ Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments(); for (Type actualTypeArgument : actualTypeArguments) {
} };
} }
|
反射操作注解
public class Testc {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException { Class c1 = Class.forName("com.chen.Student2");
Annotation[] annotations = c1.getAnnotations(); for (Annotation annotation : annotations) { System.out.println(annotation); }
TableChen tableChen =(TableChen) c1.getAnnotation(TableChen.class); String value = tableChen.value(); System.out.println(value);
Field f = c1.getDeclaredField("name"); FileChen annotation = f.getAnnotation(FileChen.class);
}
}
@TableChen("db_student") class Student2{ @FileChen(columnName = "db_id",type = "int",length = 10) private int id; @FileChen(columnName = "db_id",type = "int",length = 10) private int age; @FileChen(columnName = "db_id",type = "varchar",length = 10) private String name;
public Student2() { }
public Student2(int id, int age, String name) { this.id = id; this.age = age; this.name = name; }
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
@Override public String toString() { return "Student2{" + "id=" + id + ", age=" + age + ", name='" + name + '\'' + '}'; } }
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @interface TableChen{ String value(); }
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @interface FileChen{ String columnName(); String type(); int length(); }
|