栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java --反射

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java --反射

java --反射

** 优缺点

优点 : 可以让咱们的代码更加灵活、为各种框架提供开箱即用的功能提供了便利

缺点 :让我们在运行时有了分析操作类的能力,这同样也增加了安全问题。比如可以无视泛型参数的安全检查(泛型参数的安全检查发生在编译时)。另外,反射的性能也要稍差点,不过,对于框架来说实际是影响不大的。相关阅读


** 获取 反射的 四种 方式
如果我们动态获取到这些信息,我们需要依靠 Class 对象。Class 类对象将一个类的方法、变量等信息告诉运行的程序。Java 提供了四种方式获取 Class 对象:

1.知道具体类的情况下可以使用:

Class alunbarClass = TargetObject.class;

2…通过 Class.forName()传入类的路径获取

Class alunbarClass1 = Class.forName("cn.javaguide.TargetObject");

3.通过对象实例instance.getClass()获取

TargetObject o = new TargetObject();
Class alunbarClass2 = o.getClass();

4…通过类加载器xxxClassLoader.loadClass()传入类路径获取

Class clazz = ClassLoader.loadClass("cn.javaguide.TargetObject");
通过类加载器获取 Class 对象不会进行初始化,
意味着不进行包括初始化等一些列步骤,静态块和静态对象不会得到执行

示例:

1.创建一个我们要使用反射操作的类 TargetObject。
package Poxy.FangShe;
public class TargetObject {
    private String value;

    public TargetObject() {
        value = "JavaGuide";
    }

    public void publicMethod(String s) {
        System.out.println("I love " + s);
    }

    private void privateMethod() {
        System.out.println("value is " + value);
    }
}

2.使用反射操作这个类的方法以及参数
package Poxy.FangShe;

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

public class FMain {

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        
        Class tageClass=Class.forName("Poxy.FangShe.TargetObject");
        TargetObject targetObject= (TargetObject) tageClass.newInstance();

        
         Method[] methods  = tageClass.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println(method.getName());
        }

        
        Method publicMethod  = tageClass.getDeclaredMethod("publicMethod", String.class);
        publicMethod.invoke(targetObject,"java");


        
         Field field = tageClass.getDeclaredField("value");
        //为了对类中的参数进行修改我们取消安全检查
        field.setAccessible(true);
        field.set(targetObject, "Javafile");

        
         Method privateMethod = tageClass.getDeclaredMethod("privateMethod");
        //为了调用private方法我们取消安全检查
        privateMethod.setAccessible(true);
        privateMethod.invoke(targetObject);

    }
}



输出内容:
publicMethod
privateMethod
I love java
value is Javafile
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/301754.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号