Java通过反射动态操作类----笔记

定义测试的类

package top.demo.ref;

import org.omg.PortableInterceptor.DISCARDING;

public class Test {

    public  int id;
    private String name;


    public Test(){

    }


    public Test(String name){
        this.name=name;
    }


    private void disPrivate() {

        System.out.println("disPrivate");
    }

    private void disPrivate(String var) {

        System.out.println("disPrivate  var:"+var);
    }

    public void disPublic() {
        System.out.println("disPublic");
    }

    public void disPublic(String var) {
        System.out.println("disPublic var:"+var);
    }


    public int getId() {
        return id;
    }


    public void setId(int id) {
        this.id = id;
    }


    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }




}

测试

package top.demo.ref;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Main {

    public static void main(String argv[]) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException
    {

        //获得指定类的 类信息对象
        Class cl=(Class) Class.forName("top.demo.ref.Test");


        //----------构造函数

        //通过Class对象 获得无参构造
        Constructor cons=cl.getConstructor();
        //分别通过 构造对象和Class对象进行 创建对象 (无参构造)
        Test ob=(Test) cons.newInstance();
        Test ob2=(Test) cl.newInstance();
        ob.id=88;
        System.out.println(ob.id);

        Constructor cons2=cl.getConstructor(String.class);
        Test ob3=(Test) cons2.newInstance(String.valueOf("这是带参的构成对象 创建的Test对象,注意传入参数只能是Object"));

        //----------成员函数

        //通过getMethod拿到带参函数 (getMethod只能拿public方法  如要拿私有用带XXXDeclaredXXXX的 否则异常)
        //Method disPrivate=cl.getMethod("disPrivate", String.class);
        //Exception in thread "main" java.lang.NoSuchMethodException: top.demo.ref.Test.disPrivate(java.lang.String)

        Method disPrivateDecla=cl.getDeclaredMethod("disPrivate", String.class);
        //disPrivateDecla.invoke(ob, "因为是私有的即使拿到也不能调用");
        //Exception in thread "main" java.lang.IllegalAccessException: Class top.demo.ref.
        //setAccessible本质上是访问权限检测的开关
        disPrivateDecla.setAccessible(true);
        disPrivateDecla.invoke(ob, "通过设置 访问检测性为true 可以调用私有方法");

        Method disPublic=cl.getMethod("disPublic", String.class);
        disPublic.invoke(ob2, "因为这个方法不是静态方法,所以传入ob2实例 直接调用");

        //获得无参函数 并ob3调用
        Method getName=cl.getMethod("getName");
        System.out.println(getName.invoke(ob3,null));

        //----------成员变量
        //通过getField拿到成员变量  (于方法类似 只能拿public  私有请用XXXDeclaredXXXX)
        Field fieldId=cl.getField("id");
        fieldId.set(ob, 2);
        System.out.println(ob.getId());

        Field fieldName=cl.getDeclaredField("name");
        //fieldName.set(ob, "因为是私有的属性 所有不能访问");
        //Exception in thread "main" java.lang.IllegalAccessException: Class top.dem
        fieldName.setAccessible(true);
        fieldName.set(ob, "设置可访问后,能够正常访问私有的属性");

    }

}

你可能感兴趣的:(JavaSe)