zoukankan      html  css  js  c++  java
  • java学习基础知识十——反射

    一、反射
    1、概念图片:


    2、反射相关的主要API:

    java.lang.Class    //代表一个类
    java.lang.reflect.Method    //代表类的方法
    java.lang.reflect.Field    //代表类的成员变量
    java.lang.reflect.Constructor    //代表类的构造方法

    二、Class类:
    1、
    2、Class类常用方法

    3、实例化Class类对象

    /**
     * 实例化Class类对象的三种方法
     * @author 小虞哥哥
     *
     */
    public class TestClass {
        public static void main(String[] args) {
            Person p=new Person();
            Class clazz=p.getClass();    //clazz对象中就含p所属的Person类的所有信息
            
            //前提:若已知具体的类,通过类的class属性获取,该方法最为安全可靠,程序性能最高
            Class c1=Person.class;    
            
            //前提:已知某个类的实例,调用该实例的getClass()方法获取Class对象
            Class c2=p.getClass();    
            
            //前提:已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,可能抛出ClassNotFoundException
            try {
                Class c3=Class.forName("test.Person");    
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            System.out.println(p.getClass());
        }
    
    }

    4、反射获取一个类的父类和接口

                Class clazz=Class.forName("test.Student");    //通过包名.类名的字符串,调用Class.forName方法获取指定类的Class实例
                
                //用反射获取父类和接口
                Class superClazz=clazz.getSuperclass();        //获取父类
                System.out.println("父类:"+superClazz.getName());
                
                Class[] interfaces=clazz.getInterfaces();    //获取当前类的所有接口
                for(Class c:interfaces){
                    System.out.println("接口:"+c.getName());
                }

    5、反射获取一个类的构造方法

             Class clazz=Class.forName("test.Student");    //通过包名.类名的字符串,调用Class.forName方法获取指定类的Class实例            
            //反射获取类的构造方法
                Constructor[]cons=clazz.getConstructors();
                for(Constructor c:cons){
                    System.out.println("构造方法"+c.getName());    //取得方法名称
                    //返回数组1代表public 2代表private
                    System.out.println("构造方法"+c.getName()+"的修饰符是:"+c.getModifiers());    //取得方法的修饰符
                }
                
                Constructor[]cons1=clazz.getDeclaredConstructors();        //获取类的所有构造方法,包括共有和私有
                for(Constructor c:cons1){
                    System.out.println("构造方法"+c.getName());    //取得方法名称
                    System.out.println("构造方法"+c.getName()+"的修饰符是:"+c.getModifiers());    //取得方法的修饰符
                    Class[] paramClazz=c.getParameterTypes();        //获取构造方法的参数类型
                    for(Class pc:paramClazz){
                        System.out.println("构造方法"+c.getName()+"的参数类型是:"+pc.getName());    //取得方法的参数类型
                    }
                }

    6、反射创建一个对象

            Class clazz=Class.forName("test.Student");    //通过包名.类名的字符串,调用Class.forName方法获取指定类的Class实例
    
                //用反射的构造方法创建对象
                
                    Object obj=clazz.newInstance();    //相当于调用Student类的无参公有的构造方法
                    Student stu=(Student)obj;
                    
                    Constructor c=clazz.getConstructor(String.class);    //指定获取一个有参数且为String类型的公有的构造方法
                    Student stu1=(Student)c.newInstance("第一中学");        //newInstance实例化对象,相当于调用public
                    System.out.println(stu1.school);
                    
                    //通过反射机制,可以强制调用私有的构造方法
                    Constructor c=clazz.getDeclaredConstructor(String.class,int.class);    //指定获取有两个参数的构造方法
                    
                    c.setAccessible(true); //解除私有的封装
                    
                    Student stu=(Student)c.newInstance("张三",12);

    7、反射机制获取类的方法

              Class clazz=Class.forName("test.Student");    //通过包名.类名的字符串,调用Class.forName方法获取指定类的Class实例 
              //反射机制获取类的全部方法
                    //Method[] ms=clazz.getMethods();    //获取到类的所有公有的方法
                    Method[] ms=clazz.getDeclaredMethods();    //获取到类的所有公有私有的方法
                    for(Method m:ms){
                        System.out.println("方法名:"+m.getName());
                        System.out.println("返回值类型:"+m.getReturnType());
                        System.out.println("修饰符:"+m.getModifiers());
                    }

    三、Java动态代理

  • 相关阅读:
    java垃圾回收算法和垃圾收集器
    (转)数据库ACID特性
    数据库范式
    (转)java Exception层次结构详解
    java Thread方法解析: sleep join wait notify notifyAll
    (转)java反编译i++和++i问题
    (转)git使用教程
    (转)java位运算
    (转)原码、反码、补码
    [翻译]如何编写GIMP插件(一)
  • 原文地址:https://www.cnblogs.com/MeiToufu/p/14387717.html
Copyright © 2011-2022 走看看