Java的反射使用大致为:获取到class对象,实例化对象,获取方法,执行方法。详细请参考以下内容:
1.获取class
//直接通过类获取
Class mClass = String.class;
//通过class名获取
Class mClass = Class.forName("java.lang.String");
2.实例化对象
//通过无参构造实例化
Constructor mConstructor = mClass.getConstructor();
Object obj = mConstructor.newInstance();
//通过有参构造实例化
mClass.getConstructor(String.class);//构造函数参数类型为String
Object obj = mConstructor.newInstance("foxhome.top");//传入构造参数并且进行实例化
3.获取方法
//获取无参方法
Method lengthMethod = mClass.getMethod("length");
//获取有参方法 方法名后的参数为所传参数的class
Method startsWithMethod = mClass.getMethod("startsWith",String.class);
//获取静态方法 方法名后的参数为所传参数class,如果为无参则不填
Method valueOfMethod = mClass.getDeclaredMethod("valueOf", int.class);
4.执行方法
//执行无参方法
lengthMethod.invoke(obj);
//执行有参方法 需要与所传参数的class类型一致
startsWithMethod.invoke(obj,"你");
//执行受保护的方法
method1.setAccessible(true);
method1.invoke(obj);
//执行static 无参方法
method2.invoke(null, null);
5.获取变量
//获取public 变量
Field mField = mClass.getField("变量名称");
//获取private变量
Field mField = mClass.getDeclaredField("变量名称");
//获取static变量
Field mField = mClass.getDeclaredField("变量名称");
6.访问变量
//访问public变量
mField.get(obj);
//访问受保护变量
mField.setAccessible(true);
mField.get(obj);
//访问static变量
mField.get(null);
7.其它
//获取所有公开变量
Field[] mFields = mClass.getFields();
//获取所有受保护变量
Field[] mFields2 = mClass.getDeclaredFields();
//获取所有公开方法
Method[] mMethods=mClass.getMethods();
//获取所有受保护方法
Method[] mMethods2=mClass.getDeclaredMethods();
8.反射接口
//被反射的目标对象
top/foxhome/TestC.java
package top.foxhome;
public class TestC {
public interface CallBack {
public void onCallBack();
}
public void doCallBack(CallBack call) {
call.onCallBack();
}
}
//构建一个代理出来者
top/foxhome/MyHandle.java
package top.foxhome;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyHandle implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Hi,foxhome");
return null;
}
//执行调用
top/foxhome/Main.java
package top.foxhome;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Main {
public static void main(String[] args) {
try {
Class testClass = Class.forName("top.foxhome.TestC");
Object testCObj = testClass.newInstance();
Class callBackClass = Class.forName("top.foxhome.TestC$CallBack");
MyHandle mHandle = new MyHandle();
Object callBackObj = Proxy.newProxyInstance(Main.class.getClassLoader(), new Class[]{callBackClass}, mHandle);
Method mMethod = testClass.getDeclaredMethod("doCallBack", new Class[]{callBackClass});
mMethod.invoke(testCObj, callBackObj);
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意:protected和private均为受保护,使用.setAccessible(true);
之后即可进行访问。