zoukankan      html  css  js  c++  java
  • JDK5.0新特性-反射

    反射:
    什么是反射?
    剖析Java类中的各个组成部分映射成一个个java对象
    为什么用反射?
    多用于框架和组件,写出复用性高的通用程序

    1.Class类.
    Class代表的就是我们的字节码文件.
    三种方式.
    1.类名.class
    2.对象.getClass();
    3.Class.forName();

    在开发中创建使用第三种 Class.forName();为什么?
    这种方式耦合度低,没有依赖性.

    ------------------------------------------
    2.Constructor(构造器对象)
    构造器的作用就是用来创建对象的。
    Constructor代表的是构造器对象,我们得到它后就可以实例化对象.

    1.怎样得到Constructor对象.
    getConstructor()-----得到指定的构造器
    getConstructors();---得到所有的构造器


    2.关于Constructor的注意事项
    1.如果构造方法不是public。那么要获取其构造器对象使用 getDeclaredConstuctor()方法.

    2.对于私有化权限,在使用前必须设置权限检查.
    public void setAccessible(boolean flag)
    值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查

    3.在开发中,我们在得到Class时,一般会直接实例化类的对象.


    2.Field

    3.Method

    1.

    2.对于static方法怎样调用?
    静态方法调用时不需要使用对象,直接写null
    staticMethod.invoke(null,参数);
    方法的参数如果是数组怎样调用?

    在调用invoke时,第二个参数强制转换成Object,或在外面在包装一层数组.

    1

    package cn.itcast.reflect;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    
    import org.junit.Test;
    
    public class Demo1 {
    
        @Test
        public void demo1() throws ClassNotFoundException, InstantiationException,
                IllegalAccessException {
            Class clazz = Class.forName("cn.itcast.reflect.Teacher");
            clazz.newInstance();
    
            Teacher t = new Teacher();
        }
    
        // 获取Class对象
        @Test
        public void demo2() throws ClassNotFoundException {
    
            // 1.通过.class
            // Class clazz=Teacher.class;
    
            // 2.通过对象获取
            // Teacher t = new Teacher();
            // Class clazz = t.getClass(); //getClass方法是在Object类中定义的
    
            // 3.Class.forName()
    
            Class clazz = Class.forName("cn.itcast.reflect.Teacher");
    
        }
    
        // 获取构造器.
        @Test
        public void demo3() throws SecurityException, NoSuchMethodException,
                IllegalArgumentException, InstantiationException,
                IllegalAccessException, InvocationTargetException {
    
            // 1.得到Teacher类的Class对象.
            Class clazz = Teacher.class;
    
            // 2.得到Teacher类的构造器.
            Constructor c1 = clazz.getConstructor(); // 无参数构造
            Constructor c2 = clazz.getConstructor(String.class); // String类型参数构造
            Constructor c3 = clazz.getConstructor(String.class, int.class); // String,int类型参数构造
    
            // 3.通过Constructor对象创建Teacher类的实例.
            // Teacher obj1 = (Teacher) c1.newInstance(); // 相当于new Teacher();
            //
            // obj1.show();
    
            // Teacher obj2 = (Teacher) c2.newInstance("张三");// new Teacher("张三");
            //
            // obj2.show();
    
            Teacher obj3 = (Teacher) c3.newInstance("李四", 20);// new
                                                                // Teacher("李四",20);
    
            obj3.show();
    
        }
    
        // 关于Constructor的注意事项
        @Test
        public void demo4() throws SecurityException, NoSuchMethodException,
                IllegalArgumentException, InstantiationException,
                IllegalAccessException, InvocationTargetException {
            // 1.得到Teacher类的Class对象.
            Class clazz = Teacher.class;
            // 2.获取非public的构造器对象.
            Constructor c = clazz.getDeclaredConstructor(String.class, int.class);
    
            // 取消安全检查
            c.setAccessible(true);
    
            // 3.创建Teacher对象
            Teacher obj = (Teacher) c.newInstance("李四", 20);
    
            obj.show();
    
        }
    
        @Test
        public void demo5() throws InstantiationException, IllegalAccessException {
            Class clazz = Teacher.class;
    
            Teacher t = (Teacher) clazz.newInstance();// 要求必须存在无参构造
        }
    
        // 关于Field类.---它代表的是属性.
        @Test
        public void demo6() throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException, InstantiationException {
            // Field对象的获取也是通过Class
            Class clazz = Teacher.class;
            Field fname = clazz.getDeclaredField("name"); //相当于得到了String name属性.
            
            fname.setAccessible(true);
            
            //得到属性值.
            Teacher t=(Teacher) clazz.newInstance();
            //Object msg=fname.get(t); //相当于   t.name;
            
            
            //对属性值进行赋值操作.
            
            fname.set(t, "abcdef"); //t.name="abcdef";
            
            System.out.println(t.getName());
        }
    }

    2

    package cn.itcast.reflect;
    
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    import org.junit.Test;
    
    //Method操作
    public class Demo2 {
    
        // 得到Teacher类中的show方法的Metho对象.
        @Test
        public void fun1() throws SecurityException, NoSuchMethodException,
                IllegalArgumentException, IllegalAccessException,
                InvocationTargetException, InstantiationException {
            // 1.得到Class
            Class c = Teacher.class;
    
            // 2.得到Method
            // Method m1 = c.getMethod("show"); // 获取show();
    
            Method m2 = c.getMethod("show", String.class);
    
            // 3.让方法执行.
            Teacher t = (Teacher) c.newInstance(); // Teacher t=new Teacher();
            // m1.invoke(t); //相当于 t.show();
    
            m2.invoke(t, "good");
    
        }
    
        @Test
        public void fun2() throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException {
            // 1.得到Class
            Class c = Teacher.class;
    
            // 2.得到Method
            Method m=c.getMethod("show", String.class, int.class);
            
            //3.让方法执行.
            Object returnValue=m.invoke(c.newInstance(), "tom",20); //String msg=t.show("tom",20);
            
            System.out.println(returnValue);
    
        }
    }

    3

    package cn.itcast.reflect;
    
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    import org.junit.Test;
    
    public class Demo3 {
    
        public static void main(String[] args) {
    
            // 要通过反射去调用main方法.并传递参数.
    
            System.out.println(args[0]);
    
            System.out.println(args[1]);
    
        }
    
        @Test
        public void fun() throws SecurityException, NoSuchMethodException,
                IllegalArgumentException, IllegalAccessException,
                InvocationTargetException {
            // 1.得到当前类的Class
    
            Class clazz = Demo3.class;
            // 2.得到这个类中的main方法的Method
    
            Method main = clazz.getMethod("main", String[].class);
    
            // 3.调用main方法. invoke。
    
            //main.invoke(null, new String[]{"hello", "world"}); // 参数个数错误
            
            main.invoke(null,new Object[]{new String[]{"hello", "world"}});
            
            main.invoke(null, (Object)(new String[]{"hello", "world"}));
        }
    }

    4

    package cn.itcast.reflect;
    
    public class Teacher {
        public int age = 10;
        private String name = "tom";
    
        public Teacher() {
            System.out.println("Teacher无参构造方法");
        }
    
        public Teacher(String name) {
            this.name = name;
            System.out.println("Teacher构造方法----String name");
        }
    
        private Teacher(String name, int age) {
            this.name = name;
            this.age = age;
            System.out.println("Teacher构造方法----String name,int age");
        }
    
        public String getName() {
            return name;
        }
    
        public void show() {
            System.out.println("name:" + name + "  age:" + age);
        }
    
        public void show(String msg) {
            System.out.println(msg);
        }
        
        public String show(String msg,int i){
            return msg+"   "+i;
        }
    
    }
  • 相关阅读:
    centos8 将SSSD配置为使用LDAP并要求TLS身份验证
    Centos8 搭建 kafka2.8 .net5 简单使用kafka
    .net core 3.1 ActionFilter 拦截器 偶然 OnActionExecuting 中HttpContext.Session.Id 为空字符串 的问题
    Springboot根据不同环境加载对应的配置
    VMware Workstation12 安装 Centos8.3
    .net core json配置文件小结
    springboot mybatisplus createtime和updatetime自动填充
    .net core autofac依赖注入简洁版
    .Net Core 使用 redis 存储 session
    .Net Core 接入 RocketMQ
  • 原文地址:https://www.cnblogs.com/spadd/p/4191385.html
Copyright © 2011-2022 走看看