反射的主要用法

获取类的构造方法并使用构造方法构造类的实例

实例

package com.geek.demo.reflect;

public class ReflectTarget1 {

    //默认的带参数构造函数
    ReflectTarget1(String str) {
        System.out.println("默认的构造方法 s= " + str);
    }

    //无参的构造方法
    public ReflectTarget1() {
        System.out.println("调用了公有的无参构造方法...");
    }

    public ReflectTarget1(char name) {
        System.out.println("调用了带有一个参数的构造方法,参数值为" + name);
    }

    //多个参数的构造函数
    public ReflectTarget1(String name, int index) {
        System.out.println("调用了带有多个参数的构造方法,参数值【目标名】" + name + "【参数】" + index);
    }

    //受保护的构造参数
    protected ReflectTarget1(boolean n) {
        System.out.println("受保护的构造方法 n:" + n);
    }

    //私有的构造函数
    private ReflectTarget1(int index) {
        System.out.println("私有的构造方法 序号" + index);
    }


}

调用构造方法创建实例

package com.geek.demo.reflect;

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

public class ConstructorCollector {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class clazz = Class.forName("com.geek.demo.reflect.ReflectTarget1");
        ReflectTarget1 reflectTarget1 = null;
        //1.获取所有的公有构造方法
        System.out.println("**********所有的公有构造方法**********");
        Constructor[] constructorArray = clazz.getConstructors();
        for (Constructor constructor: constructorArray) {
            System.out.println(constructor);
        }

        //2.获取所有的构造方法(包括公有,私有,受保护,默认)
        System.out.println("**********所有的公有构造方法**********");
        constructorArray = clazz.getDeclaredConstructors();
        for (Constructor constructor : constructorArray) {
            System.out.println(constructor);
        }

        //3.获取单个带参数的构造方法
        System.out.println("**********获取公有带参数的构造方法**********");
        Constructor publicConstructor = clazz.getConstructor(String.class,int.class);
        System.out.println(publicConstructor);

        //4.获取单个私有的构造方法
        System.out.println("**********获取私有带参数的构造方法**********");
        Constructor privateConstructor = clazz.getDeclaredConstructor(int.class);
        System.out.println(privateConstructor);

        //5.调用构造方法创建实例
        System.out.println("**********调用公有构造方法创建实例**********");
        reflectTarget1 = (ReflectTarget1) publicConstructor.newInstance("Target",1);

        System.out.println("**********调用私有构造方法创建实例**********");
        //忽略掉访问修饰符
        privateConstructor.setAccessible(true);
        reflectTarget1 = (ReflectTarget1) privateConstructor.newInstance(1);
    }
}

运行结果

**********所有的公有构造方法**********
public com.geek.demo.reflect.ReflectTarget1(java.lang.String,int)
public com.geek.demo.reflect.ReflectTarget1(char)
public com.geek.demo.reflect.ReflectTarget1()
**********所有的公有构造方法**********
private com.geek.demo.reflect.ReflectTarget1(int)
protected com.geek.demo.reflect.ReflectTarget1(boolean)
public com.geek.demo.reflect.ReflectTarget1(java.lang.String,int)
public com.geek.demo.reflect.ReflectTarget1(char)
public com.geek.demo.reflect.ReflectTarget1()
com.geek.demo.reflect.ReflectTarget1(java.lang.String)
**********获取公有带参数的构造方法**********
public com.geek.demo.reflect.ReflectTarget1(java.lang.String,int)
**********获取私有带参数的构造方法**********
private com.geek.demo.reflect.ReflectTarget1(int)
**********调用公有构造方法创建实例**********
调用了带有多个参数的构造方法,参数值【目标名】Target【参数】1
**********调用私有构造方法创建实例**********
私有的构造方法 序号1

获取并操作成员变量

子类

public class ReflectTarget1 extends ReflectTargetOrigin{

    public String name;

    protected int index;

    char type;

    private String targetInfo;

    @Override
    public String toString() {
        return "ReflectTarget1[name="+name+",index=,"+index+"type=.targetInfo=]" + targetInfo;
    }
}

父类

package com.geek.demo.reflect;

public class ReflectTargetOrigin {

    String defaultMember = "default";

    public String publicMember = "public";

    protected String protectMember = "protected";

    private String privateMember = "private";
}

反射获取变量并赋值

package com.geek.demo.reflect;

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

public class FieldCollector {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class reflectClass = Class.forName("com.geek.demo.reflect.ReflectTarget1");

        //1.获取所有的公有字段
        System.out.println("**********获取所有的公有字段**********");
        Field[] fields = reflectClass.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }

        //2.获取所有的字段
        System.out.println("**********获取所有的字段**********");
        fields = reflectClass.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field);
        }

        //3.获取单个特定的公有的field
        System.out.println("**********获取公有字段并调用**********");
        ReflectTarget1 reflectTarget1 = (ReflectTarget1) reflectClass.getConstructor().newInstance();
        //获取父类公有field
        Field field = reflectClass.getField("publicMember");
        System.out.println("父类公有的field publicFiled" + field);
        //给获取到的父类field赋值
        field.set(reflectTarget1,"父类反射");
        //验证
        System.out.println(reflectTarget1.publicMember);
        field = reflectClass.getField("name");
        System.out.println("公有的field name" + field);
        //4.给获取到的field赋值
        field.set(reflectTarget1,"反射");
        //5.验证
        System.out.println(reflectTarget1.name);

        //6.获取单个私有的field
        System.out.println("**********获取私有字段并调用**********");
        field = reflectClass.getDeclaredField("targetInfo");
        System.out.println("私有的field targetInfo" + field);
        field = reflectClass.getDeclaredField("privateMember");
        System.out.println("父类私有的field targetInfo" + field);
        field.setAccessible(true);
        field.set(reflectTarget1,"反射2");
        System.out.println(reflectTarget1.toString());

    }
}

运行结果

**********获取所有的公有字段**********
public java.lang.String com.geek.demo.reflect.ReflectTarget1.name
public java.lang.String com.geek.demo.reflect.ReflectTargetOrigin.publicMember
**********获取所有的字段**********
public java.lang.String com.geek.demo.reflect.ReflectTarget1.name
protected int com.geek.demo.reflect.ReflectTarget1.index
char com.geek.demo.reflect.ReflectTarget1.type
private java.lang.String com.geek.demo.reflect.ReflectTarget1.targetInfo
**********获取公有字段并调用**********
调用了公有的无参构造方法...
父类公有的field publicFiledpublic java.lang.String com.geek.demo.reflect.ReflectTargetOrigin.publicMember
父类反射
公有的field namepublic java.lang.String com.geek.demo.reflect.ReflectTarget1.name
反射
**********获取私有字段并调用**********
私有的file targetInfoprivate java.lang.String com.geek.demo.reflect.ReflectTarget1.targetInfo
Exception in thread "main" java.lang.NoSuchFieldException: privateMember
	at java.lang.Class.getDeclaredField(Class.java:2070)
	at com.geek.demo.reflect.FieldCollector.main(FieldCollector.java:46)

只能获取父类中的public变量,获取不到private变量

反射之获取并操作成员方法

父类

public class ReflectTargetOrigin {

    String defaultMember = "default";

    public String publicMember = "public";

    protected String protectMember = "protected";

    private String privateMember = "private";

    public void publicShow(String str) {
        System.out.println("调用了父类公有的方法,str=" + str);
    }

    protected void protectedShow2() {
        System.out.println("调用了父类protected方法");
    }

    void defaultShow3() {
        System.out.println("调用了父类default方法");
    }

    private String privateShow4(int index) {
        System.out.println("调用了父类private方法,index=" + index);
        return "Show4";
    }
}

子类

public class ReflectTarget1 extends ReflectTargetOrigin{

    public void show1(String str) {
        System.out.println("调用了公有的方法,str=" + str);
    }

    protected void show2() {
        System.out.println("调用了protected方法");
    }

    void show3() {
        System.out.println("调用了default方法");
    }

    private String show4(int index) {
        System.out.println("调用了private方法,index=" + index);
        return "Show4";
    }
}

反射获取方法并执行

public class MethodCollector {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class reflect1Class = Class.forName("com.geek.demo.reflect.ReflectTarget1");

        //1.获取所有的公有方法
        System.out.println("**********获取所有的公有方法**********");
        Method[] methods = reflect1Class.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }

        //2.获取所有的方法
        System.out.println("**********获取所有的方法**********");
        methods = reflect1Class.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println(method);
        }

        //3.获取单个特定的公有的方法
        System.out.println("**********获取公有方法并调用**********");
        ReflectTarget1 reflectTarget1 = (ReflectTarget1) reflect1Class.getConstructor().newInstance();
        //获取父类公有method
        Method method = reflect1Class.getMethod("publicShow",String.class);
        System.out.println("父类公有的method publicShow" + method);
        //执行父类的方法
        method.invoke(reflectTarget1,"public");
        //获取子类公有method
        method = reflect1Class.getMethod("show1",String.class);
        System.out.println("公有的method method" + method);
        //4.执行子类方法
        method.invoke(reflectTarget1,"public");

        //6.获取单个私有的field
        System.out.println("**********获取私有方法并调用**********");
        method = reflect1Class.getDeclaredMethod("show4",int.class);
        System.out.println("私有的method show4" + method);
        method.setAccessible(true);
        method.invoke(reflectTarget1,1);
        //父类
        method = reflect1Class.getDeclaredMethod("privateShow4",int.class);
        System.out.println("私有的method privateShow4" + method);

    }
}

运行结果

**********获取所有的公有方法**********
public java.lang.String com.geek.demo.reflect.ReflectTarget1.toString()
public void com.geek.demo.reflect.ReflectTarget1.show1(java.lang.String)
public void com.geek.demo.reflect.ReflectTargetOrigin.publicShow(java.lang.String)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
**********获取所有的方法**********
public java.lang.String com.geek.demo.reflect.ReflectTarget1.toString()
public void com.geek.demo.reflect.ReflectTarget1.show1(java.lang.String)
private java.lang.String com.geek.demo.reflect.ReflectTarget1.show4(int)
protected void com.geek.demo.reflect.ReflectTarget1.show2()
void com.geek.demo.reflect.ReflectTarget1.show3()
**********获取公有方法并调用**********
调用了公有的无参构造方法...
父类公有的method publicShowpublic void com.geek.demo.reflect.ReflectTargetOrigin.publicShow(java.lang.String)
调用了父类公有的方法,str=public
公有的method methodpublic void com.geek.demo.reflect.ReflectTarget1.show1(java.lang.String)
调用了公有的方法,str=public
**********获取私有方法并调用**********
私有的method show4private java.lang.String com.geek.demo.reflect.ReflectTarget1.show4(int)
调用了private方法,index=1
Exception in thread "main" java.lang.NoSuchMethodException: com.geek.demo.reflect.ReflectTarget1.privateShow4(int)
	at java.lang.Class.getDeclaredMethod(Class.java:2130)
	at com.geek.demo.reflect.MethodCollector.main(MethodCollector.java:47)

只能获取父类中的public变量,获取不到private变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值