Java基础知识——反射的使用

反射的使用

代码示例:

public class ReflectionTest {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException, ClassNotFoundException, IOException {
            //利用反射实现操作
        Class manClass = Man.class;
        //利用反射创建Man类对象
        Constructor constructor=manClass.getConstructor(String.class,int.class);
        Object object=constructor.newInstance("Roy",22);
        Man man=(Man)object;
        System.out.println(man.toString());
        //通过反射调用对象指定的属性、方法
        Field age = manClass.getDeclaredField("age");
        age.set(man,10);
        //调用方法
        Method show = manClass.getDeclaredMethod("show");
        show.invoke(man);
//通过反射可以调用私有方法、属性、构造器
        //调用私有构造器
        Constructor constructor1=Man.class.getDeclaredConstructor(String.class);
        constructor1.setAccessible(true);
        Man sky =(Man) constructor1.newInstance("Sky");
        System.out.println(sky);
        //调用私有属性
        Field name = manClass.getDeclaredField("name");
        name.setAccessible(true);
        name.set(sky,"Roy");
        System.out.println(sky);
        //调用私有方法
        Method showNation = manClass.getDeclaredMethod("showNation", String.class);
        showNation.setAccessible(true);
        showNation.invoke(sky,"China");
    //获取Class实例的方式
        //方式一:
        Class clazz=Man.class;
        System.out.println(clazz);
        //方式二:
        Man m1=new Man();
        m1.getClass();
        System.out.println(m1.getClass());
        //方式三:调用Class的静态方法
       Class clazz1= Class.forName("cn.com.java.Man");
        System.out.println(clazz1);
        //方式四:使用类的加载器
        ClassLoader classLoader=ReflectionTest.class.getClassLoader();
        Class clazz2 = classLoader.loadClass("cn.com.java.Man");
        System.out.println(clazz2);
//使用ClassLoader加载配置文件
        Properties properties=new Properties();
     /*   //读取配置文件方式一:
        FileInputStream fis=new FileInputStream("Day20\\jdbc.properties");
        properties.load(fis);*/
        //读取配置文件方式二:
        ClassLoader classLoader1=ReflectionTest.class.getClassLoader();
        InputStream is=classLoader1.getResourceAsStream("jdbc1.properties");
       //默认文件位置识别在当前module的src下
         properties.load(is );
        //获取属性值
        String user=properties.getProperty("user");
        String password=properties.getProperty("password");
        System.out.println("user "+user+"password "+password);

    }
}

通过反射创建对应的运行时类的对象

代码示例:

public class InstanceTest {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException {
        Class<Man> clazz=Man.class;
        /*调用newInstance()方法创建对应的运行时类对象
        内部调用了运行时类的空参构造器*/
        Man man = clazz.newInstance();
        System.out.println(man);
        /*
        *调用运行时类的指定结构:属性、方法、构造器
        * */
        //获取指定的属性public权限
        Field field=clazz.getField("age");
        //设置当前属性的值
        field.set(man,22);
        //获取当前属性的值
        int id=(int)field.get(man);
        System.out.println(id);
        //方式二:规范性操作运行时类中的指定属性
        //获取指定变量名的属性private也可以
        Field name = clazz.getDeclaredField("name");
        //设置属性可访问
        name.setAccessible(true);
        name.set(man,"Jack");
        System.out.println(name.get(man));
        /*
        * 操作运行时类中的指定方法
        * */
        //获取指定的某个方法参数一方法名称,参数二形参列表
        Method show = clazz.getDeclaredMethod("showNation", String.class);
        //可访问的权限保证可访问
        show.setAccessible(true);
        //参数一方法的调用者,参数二给形参赋值的实参
        show.invoke(man,"China");
        //获取静态的方法
        Method desc = clazz.getDeclaredMethod("desc");
        desc.setAccessible(true);
        desc.invoke(Man.class);
        /*
        * 调用运行时类中指定的构造器
        * */
        //获取指定的构造器指明构造器的参数列表
        Constructor constructor = clazz.getDeclaredConstructor(String.class);
        //保证可访问
        constructor.setAccessible(true);
        //调用此构造器创建对象
        Object juli = constructor.newInstance("Juli");
        System.out.println(juli);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值