java 反射学习总结

开发中又时会遇见,需要调用其它方法类中 private 私有的方法或者参数,或者其它包里方法类里的方法情况,这个时候无法直接调取,需要用到反射去获取,直接实践,首先创建一个方法类,里面设置一些参数

public class Person {

    public String a;
    public int b;
    private int c;
    private String d;

    public Person() {
    }

    private Person(int c) {
        this.c = c;
    }

    public Person(String a, int b) {
        this.a = a;
        this.b = b;
    }

    private Person(String a, String d) {
        this.a = a;
        this.d = d;
    }

    private String getA() {
        return a;
    }

    private void setA(String a) {
        this.a = a;
    }

    public int getB() {
        return b;
    }

    public void setB(int b) {
        this.b = b;
    }

    public int getC() {
        return c;
    }

    public void setC(int c) {
        this.c = c;
    }

    private String getD() {
        return d;
    }

    private void setD(String d) {
        this.d = d;
    }

    private void getTest(String a,int b,boolean c){

    }

    @Override
    public String toString() {
        return "Person{" +
                "a='" + a + '\'' +
                ", b=" + b +
                ", c=" + c +
                ", d='" + d + '\'' +
                '}';
    }
}
	/**
     * 获取构造方法
     * @param className
     */
	public void printConstructor(String className){
        try {
            Class<?> aClass = Class.forName(className);
            //仅获取所有public构造方法
            Constructor<?>[] constructors = aClass.getConstructors();
            Log.d("sunyuke","constructors = "+constructors.length);
            for (int a = 0;a<constructors.length;a++){
                Log.d("sunyuke",constructors[a].toGenericString());
            }

			//获取所有构造方法,包括private
            Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();
            Log.d("sunyuke","declaredConstructors = "+declaredConstructors.length);
            for (int a = 0;a<declaredConstructors.length;a++){
                Log.d("sunyuke",declaredConstructors[a].toGenericString());
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    
//日志输出
constructors = 2
public com.example.testdemo.Person()
public com.example.testdemo.Person(java.lang.String,int)
declaredConstructors = 4
public com.example.testdemo.Person()
private com.example.testdemo.Person(int)
public com.example.testdemo.Person(java.lang.String,int)
private com.example.testdemo.Person(java.lang.String,java.lang.String)

	/**
     * 获取指定的构造方法
     * @param className
     * @param clzs 构造方法里的类型
     * @return
     */
    public Constructor getConstructor(String className,Class<?>... clzs){
        try {
            Class<?> aClass = Class.forName(className);
            //获取指定public构造方法
            //Constructor<?> declaredConstructor = aClass.getConstructor(clzs);
            //获取指定构造方法
            Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(clzs);
            Log.d("sunyuke",declaredConstructor.toGenericString());
			//如果获取的构造方法为private,需要设置为true才可以使用
            declaredConstructor.setAccessible(true);
            return declaredConstructor;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    //使用
    Constructor constructor = getConstructor("com.example.testdemo.Person",String.class,String.class);
        try {
            Object obj = constructor.newInstance("123","234");
            Person person = (Person) obj;
            Log.d("sunyuke","person = "+person.toString());
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
//输出日志
private com.example.testdemo.Person(java.lang.String,java.lang.String)
person = Person{a='123', b=0, c=0, d='234'}

	/**
     * 获取参数
     * @param className
     */
    public void printField(String className){
        try {
            Class<?> aClass = Class.forName(className);
            //获取所有public参数
            Field[] fields = aClass.getFields();
            Log.d("sunyuke","fields = "+fields.length);
            for (int a = 0;a<fields.length;a++){
                Log.d("sunyuke",fields[a].toGenericString());
            }

			//获取所有参数
            Field[] declaredFields = aClass.getDeclaredFields();
            Log.d("sunyuke","fields = "+declaredFields.length);
            for (int a = 0;a<declaredFields.length;a++){
                Log.d("sunyuke",declaredFields[a].toGenericString());
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
//日志输出
fields = 2
public java.lang.String com.example.testdemo.Person.a
public int com.example.testdemo.Person.b
fields = 4
public java.lang.String com.example.testdemo.Person.a
public int com.example.testdemo.Person.b
private int com.example.testdemo.Person.c
private java.lang.String com.example.testdemo.Person.d

	/**
     * 获取指定的参数
     * @param className
     * @param filedName
     * @return
     */
    private Field getField(String className,String filedName){
        try {
            Class<?> aClass = Class.forName(className);
            //获取指定的public参数
            //Field field = aClass.getField(filedName);
            
            //获取指定的参数
            Field field = aClass.getDeclaredField(filedName);
            field.setAccessible(true);
            Log.d("sunyuke",field.toGenericString());
            return field;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        return null;
    }
    //使用
    Constructor constructor = getConstructor("com.example.testdemo.Person",String.class,String.class);
        try {
            Object obj = constructor.newInstance("123","234");
            Person person = (Person) obj;

            Field field = getField("com.example.testdemo.Person","d");
            String s = (String) field.get(person);
            Log.d("sunyuke","s = "+s);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
//日志输出
private java.lang.String com.example.testdemo.Person.d
s = 234

	/**
     * 获取所以方法
     * @param className
     */
    private void printMethods(String className){
        try {
            Class<?> aClass = Class.forName(className);
            //获取所有public方法,包括Object.class里的方法
            Method[] Methods = aClass.getMethods();
            Log.d("sunyuke","Methods = "+Methods.length);
            for (int a = 0;a<Methods.length;a++){
                Log.d("sunyuke",Methods[a].toGenericString());
            }

			//获取所有方法,不包括Object.class里的方法
            Method[] declaredMethods = aClass.getDeclaredMethods();
            Log.d("sunyuke","declaredMethods = "+declaredMethods.length);
            for (int a = 0;a<declaredMethods.length;a++){
                Log.d("sunyuke",declaredMethods[a].toGenericString());
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
//日志输出
Methods = 13
public boolean java.lang.Object.equals(java.lang.Object)
public int com.example.testdemo.Person.getB()
public int com.example.testdemo.Person.getC()
public final java.lang.Class<?> java.lang.Object.getClass()
public int java.lang.Object.hashCode()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
public void com.example.testdemo.Person.setB(int)
public void com.example.testdemo.Person.setC(int)
public java.lang.String com.example.testdemo.Person.toString()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
declaredMethods = 10
private java.lang.String com.example.testdemo.Person.getA()
private java.lang.String com.example.testdemo.Person.getD()
private void com.example.testdemo.Person.getTest(java.lang.String,int,boolean)
private void com.example.testdemo.Person.setA(java.lang.String)
private void com.example.testdemo.Person.setD(java.lang.String)
public int com.example.testdemo.Person.getB()
public int com.example.testdemo.Person.getC()
public void com.example.testdemo.Person.setB(int)
public void com.example.testdemo.Person.setC(int)
public java.lang.String com.example.testdemo.Person.toString()

	/**
     * 获取指定的方法
     * @param className
     * @param methodName
     * @param clzs
     * @return
     */
    private Method getMethod(String className,String methodName,Class<?>... clzs){
        try {
            Class<?> aClass = Class.forName(className);
            Method method = aClass.getDeclaredMethod(methodName,clzs);
            method.setAccessible(true);
            Log.d("sunyuke",method.toGenericString());
            return method;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        return null;
    }
    //使用
    Constructor constructor = getConstructor("com.example.testdemo.Person",String.class,String.class);
        try {
            Object obj = constructor.newInstance("123","234");
            Person person = (Person) obj;
            
            Method method = getMethod("com.example.testdemo.Person","getD");
            Object o = method.invoke(person);
            String ss = (String) o;
            Log.d("sunyuke","ss = "+ss);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
//日志输出
private java.lang.String com.example.testdemo.Person.getD()
ss = 234
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值