Java反射

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);之后即可进行访问。

发表评论

CAPTCHAis initialing...