当前位置 博文首页 > 真香号:反射机制——(1)概念、应用场景、细节&Class对象
目录
?
目录
一、什么是Java反射:
二、应用场景
三、Class字节码对象
四、获取Class对象的三种方式
? ? ? ? 反射是Java的特征之一,是一种间接操作目标对象的机制,核心是JVM在运行的时候才动态加载类,并且对于任意一个类,都能够知道这个类的所有属性和方法,调用方法/访问属性,不需要提前在编译期知道运行的对象是谁,他允许运行中的Java程序获取类的信息,并且可以操作类或对象内部属性。程序中对象的类型一般都是在编译期就确定下来的,而当我们的程序在运行时,可能需要动态的加载一些类,这些类因为之前用不到,所以没有加载到JVM,这时,使用Java反射机制可以在运行期动态的创建对象并调用其属性,它是在运行时根据需要才加载。
? ? ? ?JAVA反射机制是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法;对于任意一个对象都能调用它的方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
? ? ? ?动态获取类中的信息,就是Java反射,可以理解为对类的解剖。
?
当我们在开发软件时,有时软件以及做好了,又需要加功能怎么办?那么我们可以在做软件时给他们提供一个接口,需要加功能时,实现该接口就行。
?
Person类
public class Person {
private int age;
private String name;
public Person(String name,int age) {
super();
this.age = age;
this.name = name;
System.out.println("Person param run..."+this.name+":"+this.age);
}
public Person() {
super();
System.out.println("person run");
}
public void show(){
System.out.println(name+"...show run..."+age);
}
private void privateMethod(){
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......");
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
?
?第一种:Object中getClass( )方法
/**
* 第一种
* 1、Object类中的getClass()方法
* 想要这种方式,必须要明确具体的类,并创建对象
* 麻烦
*/
public static void getClassObjetc_1() {
Person p1 = new Person();
Class<? extends Person> clazz = p1.getClass();
Person p2 = new Person();
Class<? extends Person> clazz2 = p2.getClass();
System.out.println(clazz == clazz2);//true
}
第二种:任何数据类型都有一个静态属性.class类获取其对应的Class对象
/**
* 第二种
* 2、任何数据类型都有一个静态属性.class类获取其对应的Class对象。
* 相对简单 但还是要明确用到类中的静态成员。
* 但是还是不够扩展
*/
public static void getClassObject_2(){
Class<Person> clazz = Person.class;
Class<Person> clazz2 = Person.class;
System.out.println(clazz==clazz2);//true
}
第三种:Class.forName("xxxx") 给定字符串类名获取
/**
* 方式三
* 3、只要通过给定的类的字符串名称(类路径)就可以获取该类,更为扩展
* 用Class 类中的方法就可以完成
* 该方法就是Class.forName()
* 该方法只要有名称即可,更方便,扩张性更强。
*
*/
public static void getClassObject_3() throws ClassNotFoundException {
String className="com.study.reflection.Person";
Class<?> clazz = Class.forName(className);
System.out.println(clazz);//class com.study.reflection.Person
}
?
?
cs