java 反射学习总结

本文详细介绍了Java反射机制的使用,包括如何通过反射获取类的构造方法、字段和方法,并提供了实例演示如何调用私有方法和访问私有字段。通过反射,可以在运行时动态操作类和对象,增强了代码的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发中又时会遇见,需要调用其它方法类中 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值