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动态代理

posted @ 2021-02-08 09:56  MeiTofu  阅读(38)  评论(0编辑  收藏  举报