、java学习型技术博客、期待与您交流! ——-
java反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称之为java语言的反射机制
动态获取类中的信息,就是java反射
可以理解为对类的解剖。
当程序员写好了一个类(例如:bean.Person)
在运行的时候,jvm就会产生,字节码文件(class Class)
这个字节码文件中就有我们写好的类中的全部内容。
比如:
名称
字段
构造函数
一般函数
该类(Class)就可以获取字节码文件中的所有内容
那么反射,就是依靠该类完成的
想要对一个类文件进行解剖,只要获取到该类的
字节码文件对象即可
获取字节码文件的三种方式
/*
要想对字节码文件进行解剖,必须要有字节码文件对象。
如何获取字节码文件对象呢?
* */
public class three1 {
public static void main(String[] args) throws ClassNotFoundException {
getClassObject_1();
}
/*
方式三:
只要通过给定的类的字符串名称就可以获取该类,更为扩展。
可以用Class类中的方法完成。
该方法就是forName.
这种方式只要有名称即可,更为方便,扩展性更强
* */
public static void getClassObject_3() throws ClassNotFoundException{
String className="bean.Person";//这个要到包名,因为是字符串,和倒不倒包没有关系
Class clazz=Class.forName(className);
System.out.println(clazz);
bean.Person p=new bean.Person();
System.out.println(p);
}
/*
方式2:
2.任何数据类型都具备一个静态的属性,class来获取其对应的class对象。
相对简单,但是还是需要明确要用到类中的静态成员
还是不够扩展
*
* */
private static void getClassObject_2(){
Class clazz=Person.class;
Class clazz1=Person.class;
System.out.println(clazz==clazz1);
}
/*
获取字节码对象的方式1;
Object类中的getClass()方法的。
想要使用这种方式,必须要明确具体的类,并并创建对象
* */
public static void getClassObject_1(){
Person p=new Person();
Class clazz=p.getClass();
Person p1=new Person();
Class clazz1=p1.getClass();
System.out.println(p);
System.out.println(clazz);
System.out.println(clazz==clazz1);
}
}
//person类
public class Person {
private int age;
private String name;
public Person() {
super();
System.out.println("person run");
}
public Person( String name, int age) {
super();
this.age = age;
this.name = name;
System.out.println("person param run"+this.name+":"+this.age);
}
public void show(){
System.out.println(name+"....show run...."+age);
}
public void method(){
System.out.println("method run");
}
public void paramMethod(String str,int num){
System.out.println("paramMethod run..."+str+":"+num);
}
public static void staticMethod(){
System.out.println("static method run.....");
}
}