![b68d65f5d495cd7d150aa014c4c24776.png](https://i-blog.csdnimg.cn/blog_migrate/d3e84f49f5273a998476969546b94ab5.jpeg)
二、Java反射原理剖析一
应用:
IDE的自动提示功能,对象(提示属性,方法)-----通过java反射机制
serviet--->程序员定义---->配置文件中配置--->serviet对象是如何创建的?--->是由tomcat创建---->是根据配置信息创建的--->类的全路径--->tomcat可以根据类的完整名称创建对象
反射他可以根据一个字符串(类的全路径)创建一个类的对象!
官方定义:在程序的运行过程中,可以动态的创建对象
A a=new A();
反射--->字符串=动态的创建对象
字符串是可以从配置文件读取的
字节码文件对象--->Class类的对象--->是Java中的一个类型
定义一个类class A{}---->JAVA中的关键字,用了定义一个类的
字节码文件
java源文件进行编译(javac)之后的class文件
字节码文件对象
jvm把字节码文件加载到jvm内存中去之后,jvm就人为这个字节码文件是一个字节码文件对象。
如何获得字节码文件对象
Object类的getClass方法
类型class属性
Class.forName("类的路径")
使用字节码文件对象
字节码文件对象中包含啥?
类 字节码文件对象
构造方法 构造方法对象(类型Constructor)
成员变量 成员变量对象(类型Field)
成员方法 成员方法对象(类型Method)
来用字节码文件对象来构建一个类的对象
之前一直是用new的形式创建一个类的对象
Person p=new Person(); 其中Person()是类的构造方法,因为对象是通过构造方法创建出来的
用字节码文件中的构造器对象来创建一个类的对象-----Constructor对象
实现过程
public class Test2 {
public static void main(String[] args) throws Exception {
//读取配置文件中的类的信息
FileReader f=new FileReader("C:Userscdliujia6eclipse-workspacejava_reflectbinaa.txt");
BufferedReader br=new BufferedReader(f);
String str = br.readLine();
System.out.println(str);
Person p=new Person();//传统形式
//用字节码文件对象创建一个类的对象
Class clazz=Class.forName(str);
//得到字节码文件对象中的构造对象
Constructor[] constructors = clazz.getConstructors();//getConstructors()得到这个类中所有的构造器对象,返回数组;
System.out.println(constructors.length);
System.out.println(constructors[0]);
System.out.println(constructors[1]);
Constructor c=constructors[0];//c是字节码文件( clazz)中构造器对象
//用构造器对象创建类的对象
Object obj=c.newInstance();
//Person2 p2=(Person2) obj;
//p2.eat();
System.out.println(obj);
}
}