java反射概念
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制
对象的编译类型和运行类型:
Object obj=new Date(); //编译类型 Object,运行类型Date
在实际应用 中,我萌初学者常需要用到强制类型转换,或则使用instanceof判断该类的实际类型,
如果某个参数是某个函数返回值,而又不知道他的类型,怎么解决?
其实应该指出,类也是一种对象,那么该对象怎么描述的? 其描述的类是 Class;
Class类:用于描述一切类/接口(枚举是一种类,注解是一种接口)
Class实例:就是JVM中的一份字节码
Class类提供范型来区分是哪一个类的字节码
Class<Date> clz1=Date.class;//clz1表示是Date的字节码;
Class<String> clz2=String.class;//clz2表示是String的字节码
获取Class的实例的方法
- 类名.class(就是一份字节码)
- 每一个对象都有一个getClass方法;obj.getClass(),返回对象的运行类型;
- 通过Class.forName(“全限定名”)获得实例,全限定名既包名+类名;(常用此种方法获得Class实例)
public static void main(String[] args) {
//first way to get the class's object
//很少用 已知类的class直接获得字节码流
Class<User> clz1=User.class;
System.out.println(clz1);
try {
//包名+类名;Class 的forName(String s1)
Class<?> clz2=Class.forName("com.reflect.test.User");
System.out.println(clz2);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//对象的getClass方法
Date date=new Date();
Class<?> clz3=date.getClass();
System.out.println(clz3);
}
对于对象来说,其Class对象可以通过以上3中方式获得
JDK内置9大Class实例
*byte,int,long,double,char,boolean,float,short,*void关键字
而对于基本数据类型,他们的Clas实例获得?其实他们都有class属性;
如 Class clz=int.class;boolean.class;….
Class cla=void.class;
System.out.println(int.class); // int
System.out.println(void.class);//void
//八大基本类型包装类有一个常量 TYPE,表示该包装类对应基本类型的Class实例
System.out.println(Integer.class); //class java.lang.Integer
System.out.println(Integer.TYPE==int.class);//true
在Class中: Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions.:即数组Class实例是->所有的相同元素数组和
相同的维数共用一个Class实例;
String[] arr1={"w"};
String[] arr2={"qw"};
String[][] arr3={};
int[] arr4={};
Class clz1=String.class;
Class clz2=arr1.getClass();
Class clz3=arr2.getClass();
Class clz4=arr3.getClass();
Class clz5=arr4.getClass();
———————————–反射的实用用法举例——————————–
*获取构造器*