java的反射主要使用了以下几个类:Class Method Constructor Field。
顾名思义:
Class 是类,可以通过以下几种方式取得:
Class.forName("xx");
MyModel.class
Constructor.newInstance(Object ... initargs)
Field是这个类中包含的属性。
具体看一下代码:
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Created by vito.zhou on 2016/6/14.
*/
public class ReflectModel {
private String privateField;
String normalField;
public int publicField;
private void privateMethod() {}
public ReflectModel(String privateField, String normalField) {
this.privateField = privateField;
this.normalField = normalField;
}
public String getPrivateField() {
return privateField;
}
public void setPrivateField(String privateField) {
this.privateField = privateField;
}
public void printField() {
System.out.println(getPrivateField() + ":" + normalField);
}
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class reflectModelClass = Class.forName("ReflectModel");
Constructor constructor = reflectModelClass.getConstructor(String.class, String.class);
ReflectModel reflectModel = (ReflectModel)constructor.newInstance("Hello", "World");
reflectModel.printField();
Method[] methodAry = reflectModelClass.getMethods();
for (Method method:methodAry) {
System.out.println(method.getName());
if (method.getName().equals("setPrivateField")) {
method.invoke(reflectModel, "Set Hello");
}
}
reflectModel.printField();
Field[] fields = reflectModelClass.getFields();
for (Field field:fields) {
System.out.println(field.getName());
}
}
}
java反射可以操作类中的属性方法等特性 可以使得java可以实现代理。代理可以下一次开始记录