二十、反射

一、反射相关API

		什么是反射?
			反射:可以在运行时期动态创建对象,并且可以获取相关成员。
	
	1.实例化Class对象,有三种方式,
        Class.forName(类名全路径); //通过Class的静态方法
        对象.getClass() //通过对象.getClass方法
        int.class //基本数据类型及基本数据类型的封装了,例如Integer

    2.获取父类
        Class<?> clazz  = Class.forName(类名全路径); //通过Class的静态方法
        Class<?> superclass = clazz.getSuperclass(); //获取继承的父类

    3.获取实现接口
        Class<?> clazz  = Class.forName(类名全路径); //通过Class的静态方法
        Class<?>[] interfaces = clazz.getInterfaces() // //获取实现的接口


    4.构造方法
        Class<?> clazz  = Class.forName(类名全路径); //通过Class的静态方法
      
        Constructor<?> constructor = clazz.getConstructor(Class<?>  ... class);//获取公共构造方法
        Constructor<?> constructor = clazz.getDeclaredConstructor()//获取所以的构造方法
       
        constructor.newInstance(Object args); //创建对象

    5.获取所有构造函数及构造参数的类型
        Class<?> clazz  = Class.forName(类名全路径); //通过Class的静态方法
        Constructor<?>[] constructors = clazz.getConstructors();//公共的
        Constructor<?>[] constructors = clazz.getDeclaredConstructors()//包括私有的

         for (int i = 0; i < constructors.length; i++) {
            Class<?> clazzs[] = constructors[i].getParameterTypes();//获取类型
            System.out.print("constructors[" + i + "] (");
            for (int j = 0; j < clazzs.length; j++) {
                if (j == clazzs.length - 1)
                    System.out.print(clazzs[j].getName());
                else
                    System.out.print(clazzs[j].getName() + ",");
            }
            System.out.println(")");
        }


    6.通过无参实例化对象
        Class<?> clazz  = Class.forName(类名全路径); //通过Class的静态方法          
        class.newInstance();



    7.属性相关
        Class<?> clazz  = Class.forName(类名全路径); //通过Class的静态方法          

        Field field = clazz.getField(String name);//获取公共字段
        Field field = clazz.getDeclaredField(String name);//获取私有公共字段
        
        Field[] field = clazz.getFields();//获取所有公共字段
        Field[] field = clazz.getDeclaredFields();//获取包括私有所有字段
		
        Field field = clazz.getDeclaredField("heihei");
        field.setAccessible(true);//设置java取消访问检查,也就是说如果是私有的也可以访问,
        field.set(obj, "Java反射机制");


    8.方法相关
        Class<?> clazz  = Class.forName(类名全路径); //通过Class的静态方法          

        clazz.getMethod(String name ,Class<?> ... parame);//获取公共指定方法
        clazz.getDeclaredMethod(String name ,Class<?> ... parame)//获取私有指定方法
        
        clazz.getMethods()//获取公共所有方法
        clazz.getDeclaredMethods();//获取包括私有全部方法

        Method method = clazz.getMethod("add");
        method.invoke(clazz.newInstance());

        method = clazz.getMethod("getInfo", int.class, String.class);
        method.setAccessible(true)//设置java取消访问检查,也就是说如果是私有的也可以访问,
        method.invoke(clazz.newInstance(), 20, "张三");


    9.获取数组或者list中的类型,如果不是数组或集合返回null
    
        Class<?> clazz  = Class.forName(类名全路径); //通过Class的静态方法  
        Class<?> componentType = clazz.getComponentType();
        

二、泛型的反射

2.1 Type接口
	
	+++ Object类
			所有类的终极父类,它被直接或间接的继承。
	
	+++ Type接口	
			Type是所有类型的公共接口。它包括原始类型、引用类型、参数化类型等。

2.2 ParameterizedType (参数化类型 即 B<T >)
		+++ 参数化类型(ParameterizedType )
			List<String>  list   =  new   ArrayList<String>();
			
			泛型集合:     list
			集合元素定义: new   ArrayList<String>();  
			参数化类型:  ParameterizedType 
					即:“ArrayList<String> ” 为参数化类型

2.3 getGenericSuperclass和getSuperclass
	1.Class<? super T> getSuperclass():
						返回直接继承的父类(由于编译擦除,没有显示泛型参数)
						
	2.Type getGenericSuperclass():
						返回直接继承的父类(包含泛型参数)
class A<T> {
	public A() {
		
		//this指的是子类对象
		//获取父类对象
		Class<?> superclass = this.getClass().getSuperclass();
		System.out.println(superclass); //  class A
		
		Type type = this.getClass().getGenericSuperclass();
		System.out.println(type); //	A<B>
	}
}



public class Demo1 extends A<B>{
	
	 public static void main(String[] args) {
		 Demo1 d=new Demo1();
	}
}


2.4 获取参数化类型对象
public class Demo1 extends A<B>{
	
	 public static void main(String[] args) {
		 Demo1 d=new Demo1();
	}
}

class A<T> {
	public A() {
		
		//this指的是子类对象
		//获取父类对象		
		Type type = this.getClass().getGenericSuperclass();
		
		ParameterizedType  param=(ParameterizedType) type;
		
		//获取泛型类型
		Type[] types = param.getActualTypeArguments();
		Class clazz=(Class) types[0];
		
		System.out.println(clazz); //class B
	}
}


三、注解的反射

		
		Class、Field、Method等成员都有注解的反射相关API,
		可以获取到类、属性、方法上的注解。
		
					xx.getAnnotation(Table.class);
							获取指定的注解
							
					xx.isAnnotationPresent(Table.class);
							判断指定的注解是否存在
							
					xx.getAnnotations();
							获取所有的注解
		

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值