publicclassReflectionTest01{publicstaticvoidmain(String[] args){/*
Class.forName()
1、静态方法
2、方法的参数是一个字符串
3、字符串需要的是一个完整类名
4、完整类名必须带有包名。java.lang包不能省略
*///c1是Class数据类型,代表String.class文件,或者c1代表String类型
Class c1= null;try{
c1 = Class.forName("java.lang.String");}catch(ClassNotFoundException e){
e.printStackTrace();}
System.out.println(c1);//java中任何一个对象都有getClass(),继承自Object类
String s ="abc";
System.out.println(s.getClass());//s.getClass代表String字节码文件
System.out.println(c1 == s.getClass());//true,比较的是两个地址//c1和s.getClass保存的内存地址是一样的,都指向方法区中的字节码文件//JVM加载类的时候,.class字节码文件只会装载一份//第三种方式:java语言中任何一种类型,包括基本数据类型,它都有.class属性
Class x= String.class;//x代表String类型
Class y= Date.class;//y代表Date类型
Class z=int.class;//z代表int类型
System.out.println(c1 == x);//true//false
System.out.println("class java.lang.String".equals(c1));//false
System.out.println("class java.lang.String".equals(s.getClass()));//false}}
通过Class的newInstance()方法来实例化对象
注意:newInstance()调用的是无参构造,必须保证无参构造存在
publicclassReflectionTest02{publicstaticvoidmain(String[] args){//不使用反射机制创建对象
User user =newUser();//使用反射机制创建对象(更灵活)try{//通过反射机制,获取Class,通过Class来实例化对象//()完整类名带包名
Class c= Class.forName("reflection.User");//newInstance()会调用User这个类的无参构造方法,完成对象的创建//重点是:newInstance()调用的是无参构造,必须保证无参构造存在
Object o = c.newInstance();
System.out.println(o);//reflection.User@b4c966a}catch(InstantiationException e){
e.printStackTrace();}catch(IllegalAccessException e){
e.printStackTrace();}catch(ClassNotFoundException e){
e.printStackTrace();}}}