反射
能够分析类能力的程序称为反射!Java在运行期间,系统始终为所有的对象维护一个被称为运行时的类型标识.这个信息追踪着
每个对象所属的类.虚拟机利用运行时类型信息选择相应的方法执行(利用反射的机制),通过专门的java类访问这些信息,保存
这些信息的类叫做Class.
Class的常用方法
获得Class
c1=stu.getClass();
try {
c2=Class.forName("com.luhao.bean.Student");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
c3=Student.class;
c4=int.class;
c5=Integer.class;
c6=String[].class;
获得类名
//返回类的名字
System.out.println("ClassName = "+c1.getName());
System.out.println("ClassName = "+c2.getName());
System.out.println("ClassName = "+c3.getName());
System.out.println("ClassName = "+c4.getName());//int
System.out.println("ClassName = "+c5.getName());//java.lang.Integer
System.out.println("ClassName = "+c6.getName());//[LJava.lang.String
//返回类的简写名字
System.out.println("ClassSimpleName = "+c1.getSimpleName());
比较,可以使用等号
因为虚拟机为每个类管理一个对象.所以同样的类,不论怎么获取得到的Class都是同一个.经过测试和泛型无关,和引用无关.
System.out.println(c1==c2);//true
System.out.println(c1.equals(c3));//true,没有重写equals
List<Student> list1=new ArrayList<Student>();
List<Integer> list2=new ArrayList<Integer>();
ArrayList<Integer> list3=new ArrayList<>();
System.out.println(list1.getClass()==list2.getClass());//true
System.out.println(list1.getClass()==list3.getClass());//true
实例化对象(Java9中 newInstance方法已过时)
//动态创建像同类的实例
Object obj=null;
try {
obj=c1.newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(obj.getClass().getSimpleName());//Student
System.out.println(obj);//[stuName=null,stuAge=0,stuSchool=null]
应当使用以下方法实例化对象
try {
obj1=c1.getDeclaredConstructor().newInstance();//第一个括号内为Constructor类型的所需参数,空表示无参构造器
obj2=c1.getDeclaredConstructor(String.class,int.class,School.class).newInstance("test",10,sc);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
System.out.println(obj1);
System.out.println(obj2);
利用反射分析类的结构
java.lang.reflect包下面有三个类
Feild-字段
Method-方法
Constructor-构造器
练习:通过类名/实例对象/地址获得该类的全部信息