反射创建对象以及方法的使用

反射创建对象以及方法的使用

反射获取构造器

import java.lang.reflect.Constructor;

public class Test {

    public static void main(String[] args) {
        try {
            Class clazz = Class.forName("com.geek.pritice.Father");

            /*
            //通过Father类的class对象来获取其无参构造,然后强转为Father类型,就相当于无参构造Father对象,高级版本已被弃用,不推荐使用
            Father father = (Father)clazz.newInstance();
            father.doIt();
            */

            //先获取构造器(分别是无参构造和单参构造)
            Constructor constructor = clazz.getConstructor();
            Constructor constructor1 = clazz.getDeclaredConstructor(int.class);
            //然后用构造器调用newInstance方法,强转为Father类型,如果是有参构造那么参数要写入相应的值
            Father father = (Father) constructor.newInstance();
            constructor1.setAccessible(true);
            Father father1 = (Father) constructor1.newInstance(20);

            System.out.println(father.a);
            System.out.println(father1.a);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

class Father{
    public int a = 10;
    private String b = "字符串";
    boolean c = true;
    protected double d = 10.2;

    public Father() {
    }

    private Father(int a) {
        this.a = a;
    }

    private int getA(){
        return this.a;
    }

    public void doIt(){
        System.out.println("这是doIt方法");
    }
}

以上有一点要注意,我们可以通过getDeclaredConstructor()去获得private构造器,但是无法去使用其创建对象,我成功创建对象的原因用了权限检测关闭方法 constructor1.setAccessible(true); 当参数为true时,对应的属性或者方法权限检测关闭

反射获取方法的使用

方法名.invoke(对象, 参数值)

import java.lang.reflect.Method;

public class Test {

    public static void main(String[] args) {
        try {
            Class clazz = Class.forName("com.geek.pritice.Father");
            //反射创建对象
            Father father = (Father)clazz.getConstructor().newInstance();
            //获取returnThis方法
            Method returnThis = clazz.getDeclaredMethod("returnThis", String.class);
            //执行方法 方法名.invoke(对象, 参数值)
            returnThis.invoke(father,"这句话应该返回");
            //获取getA方法
            Method getA = clazz.getDeclaredMethod("getA");
            //让private的私有方法权限检测关闭
            getA.setAccessible(true);
            //执行方法 方法名.invoke(对象, 参数值)
            getA.invoke(father);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

class Father{
    public int a = 10;
    private String b = "字符串";
    boolean c = true;
    protected double d = 10.2;

    public Father() {
    }

    private Father(int a) {
        this.a = a;
    }

    private int getA(){
        System.out.println(this.a);
        return this.a;
    }

    public void doIt(){
        System.out.println("这是doIt方法");
    }

    public void returnThis(String s){
        System.out.println(s);
    }
}

反射获取属性

通过反射获取的属性是从class对象中取出来的属性,都是默认值,我们要对具体对象进行操作时应该在参数里加上对象,属性和方法均是如此

import java.lang.reflect.Field;

public class Test {

    public static void main(String[] args) {
        try {
            Class clazz = Class.forName("com.geek.pritice.Father");
            //反射创建对象
            Father father = (Father)clazz.getConstructor().newInstance();
            //获取abcd属性
            Field a = clazz.getDeclaredField("a");
            Field b = clazz.getDeclaredField("b");
            Field c = clazz.getDeclaredField("c");
            Field d = clazz.getDeclaredField("d");
            //abcd设置
            a.set(father,20);
            b.setAccessible(true);
            b.set(father,"666");
            c.set(father,false);
            d.set(father,10.2);
			//输出属性对应的值 属性.get(对象)
            System.out.println(a.get(father));
            System.out.println(b.get(father));
            System.out.println(c.get(father));
            System.out.println(d.get(father));


        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

class Father{
    public int a = 10;
    private String b = "字符串";
    boolean c = true;
    protected double d = 10.2;

    public Father() {
    }

    private Father(int a) {
        this.a = a;
    }

    private int getA(){
        System.out.println(this.a);
        return this.a;
    }

    public void doIt(){
        System.out.println("这是doIt方法");
    }

    public void returnThis(String s){
        System.out.println(s);
    }

    private void setB(String s){
        this.b = s;
    }
}
posted @ 2023-03-13 23:16  Geek李  阅读(48)  评论(0)    收藏  举报