反射一篇全知晓

当然可以,反射(Reflection)是编程语言中的一个强大特性,它允许程序在运行时检查或修改其自身结构(如类、接口、字段和方法)的行为。这种能力使得程序更加灵活和动态,尽管它也可能带来一些性能开销和复杂性。

下面是关于属性的反射:

class ReflectFiledTest {
    public String PublicName;
    protected String ProtectName;
    private String PrivateName;

    public ReflectFiledTest(String publicName) {
        PublicName = publicName;
    }
}

public class FieldTest {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {

        //调用属性的反射方法
        filedMethod();
    }
    public static  void filedMethod() throws NoSuchFieldException, IllegalAccessException {
       Class minClass= ReflectFiledTest.class;

       //获取属性
        /*
        * public java.lang.String com.wl.reflect.ReflectFiledTest.PublicName
        * 只能获取到共有的
        * */
        Field publicName = minClass.getField("PublicName");
//        Field ProtectName = minClass.getField("ProtectName");  错误
//        Field PrivateName = minClass.getField("PrivateName");  错误
        System.out.println(publicName);
        System.out.println("===================================");


        /*
        * public java.lang.String com.wl.reflect.ReflectFiledTest.PublicName
            protected java.lang.String com.wl.reflect.ReflectFiledTest.ProtectName
            private java.lang.String com.wl.reflect.ReflectFiledTest.PrivateName
            * 可以输出所有类型的
        *
        *
        * */
        Field publicDecName = minClass.getDeclaredField("PublicName");
        Field ProtectDecName = minClass.getDeclaredField("ProtectName");
        Field PrivateDecName = minClass.getDeclaredField("PrivateName");
        System.out.println(publicDecName+"\n"+ProtectDecName+"\n"+PrivateDecName);
        System.out.println("===================================");


        /*
        *public java.lang.String com.wl.reflect.ReflectFiledTest.PublicName
        * 只能获取到public
        * */
       Field[] fields=minClass.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("===================================");


        /*
        *public java.lang.String com.wl.reflect.ReflectFiledTest.PublicName
        protected java.lang.String com.wl.reflect.ReflectFiledTest.ProtectName
        private java.lang.String com.wl.reflect.ReflectFiledTest.PrivateName
        * 获取到所有的
        *
        * */
        Field[] fields2=minClass.getDeclaredFields();
        for (Field field : fields2) {
            System.out.println(field);
        }
        System.out.println("===================================");


        /*
        * 输出修饰符的值
        * 1: public
        * 2: private
        * 4: protected
        * */
        int modifiers = minClass.getDeclaredField("PrivateName").getModifiers();
        System.out.println(modifiers);
        System.out.println("===================================");



        /*
        *输出成员变量
        * PublicName
        ProtectName
        PrivateName
        * */
        Field[] fields3=minClass.getDeclaredFields();
        for (Field field : fields3) {
            System.out.println(field.getName());
        }
        System.out.println("===================================");




        /*
        * 获取值并且修改值
        * get() 传入要获取的对象的值
        * set()  进行修改值 传入要修改的对象,已经要被需修改的内容。
        * */
        ReflectFiledTest reflectFiledTest = new ReflectFiledTest("innerPublicName");
        String publicName1 = (String) reflectFiledTest.getClass().getField("PublicName").get(reflectFiledTest);
        System.out.println(publicName1);
        reflectFiledTest.getClass().getField("PublicName").set(reflectFiledTest, "innerPublicName2");
        String publicName2 = (String) reflectFiledTest.getClass().getField("PublicName").get(reflectFiledTest);
        System.out.println(publicName2);
    }
}

以下是关于方法的反射用法

自定义个注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface  TestAnno {
    String value() default "默认的value";
}
class ReflectMethodTest {
    public String PublicName;
    protected String ProtectName;
    private String PrivateName;

    public ReflectMethodTest(String publicName) {
        PublicName = publicName;
    }

    @TestAnno(value = "set template")
    public void setPublicName(String publicName) {
        PublicName = publicName;
    }

    @TestAnno(value="get template")
    protected String getProtectName() {
        return ProtectName;
    }

    private String getPrivateName() {
        return PrivateName;
    }

    @TestAnno(value = "即将输出我")
    public String output(String xx){
        return xx;
    }

}
public class MethodTest {
    public static void main(String[] args) throws Exception {

        reflectMethod();
    }

    private static void reflectMethod() throws Exception {

        Class aClass = ReflectMethodTest.class;


        /*
        *
        * declare 可以获取到所有修饰符的变量
        * public com.wl.reflect.ReflectMethodTest(java.lang.String)
        public void com.wl.reflect.ReflectMethodTest.setPublicName(java.lang.String)
        protected java.lang.String com.wl.reflect.ReflectMethodTest.getProtectName()
        private java.lang.String com.wl.reflect.ReflectMethodTest.getPrivateName()
        *
        * */
        Constructor constructor = aClass.getConstructor(String.class);
        System.out.println(constructor);
        Method reflectMethodTest = aClass.getDeclaredMethod("setPublicName", String.class);
        Method getProtectName = aClass.getDeclaredMethod("getProtectName");
        Method getPrivateName = aClass.getDeclaredMethod("getPrivateName");
        System.out.println(reflectMethodTest);
        System.out.println(getProtectName);
        System.out.println(getPrivateName);

        System.out.println("========================================");


        /*
        * getMethod 只能获取到public修饰的变量
        * */
        Method reflectMethodTest2 = aClass.getMethod("setPublicName", String.class);
        System.out.println(reflectMethodTest2);
        System.out.println("========================================");



        /*
        *
        * 获取到所有的public方法
        * public void com.wl.reflect.ReflectMethodTest.setPublicName(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 java.lang.String java.lang.Object.toString()
        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()
        * */
        Method[] methods = aClass.getMethods();
        Arrays.stream(methods)
                .forEach(System.out::println);

        System.out.println("========================================");


        /*
        * 获取到所有类型的方法(当前类额外编写的)
        * protected java.lang.String com.wl.reflect.ReflectMethodTest.getProtectName()
            private java.lang.String com.wl.reflect.ReflectMethodTest.getPrivateName()
            public void com.wl.reflect.ReflectMethodTest.setPublicName(java.lang.String)
        *
        *
        * */

        Method[] declaredMethods = aClass.getDeclaredMethods();
        Arrays.stream(declaredMethods)
                .forEach(System.out::println);
        System.out.println("========================================");




        /*
        * 输出对应参数
        *java.lang.String arg0
        * */
        Parameter[] getProtectNames = aClass.getDeclaredMethod("setPublicName", String.class).getParameters();
        Arrays.stream(getProtectNames).forEach(s-> System.out.println(s));
        System.out.println("========================================");


        /*
        * 获取到返回类型
        * */
        Class<?> getPrivateName1 = aClass.getDeclaredMethod("getPrivateName").getReturnType();
        System.out.println(getPrivateName1);
        System.out.println("========================================");
        /*
        * 获取携带注解的方法,输出注解的信息
        * getProtectName注解为:get template
            getPrivateName注解为:null
            setPublicName注解为:set template
        * */
        Method[] declaredMethods1 = aClass.getDeclaredMethods();
        for (Method m: declaredMethods1){
            TestAnno annotation = m.getAnnotation(TestAnno.class);
            if(annotation==null){
                //没有注解,输出方法名+null
                System.out.println(m.getName()+"注解为:"+null);
            }else{
                //输出注解加注解的当前值
                System.out.println(m.getName()+"注解为:"+annotation.value());
            }
        }


        System.out.println("========================================");
        /*
        * 输出注解外,通过invoke进行修改
        *注解内容=即将输出我
        对象默认值=
        反射干预后
        修改后的值
        * */
        Method output = aClass.getDeclaredMethod("output",String.class);
        System.out.println("注解内容="+output.getAnnotation(TestAnno.class).value());
        ReflectMethodTest reflectMethodTest1 = new ReflectMethodTest("ss");
        System.out.println("对象默认值="+reflectMethodTest1.output(""));
        System.out.println("反射干预后");
        String text =(String) output.invoke(reflectMethodTest1, "修改后的值");
        System.out.println(text);
//        System.out.println("对象默认值="+reflectMethodTest1.output());

    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值