package bean;
public class Person {
private int age;
private String name;
public Person() {
super();
System.out.println("...Person run...");
}
public Person(int age, String name) {
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..." + str + ":" + num);
}
public static void staticMethod() {
System.out.println("...staticMethod run...");
}
}
=====================分割线=========================
/*
* 要想对字节码文件进行解剖,必须要有字节码文件对象,如何获取字节码文件对象呢?
*
*/
package demo;
import bean.Person;
public class Demo {
public static void main(String[] args) throws ClassNotFoundException {
// getClassObject_1();
// getClassObject_2();
getClassObject_3();
}
/*
* 获取字节码文件对象的方式一:
*
* 通过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(clazz == clazz1);
/*
* 该函数运行结果:
* ...Person run...
* ...Person run...
* true
* 因为p和p1都是依赖于同一个class完成的
*/
}
/*
* 获取字节码文件对象的方式二:
*
* 任何数据类型都具备一个静态的属性.class来获取其对应的Class对象。
* (相对简单,但是还要明确用到类中的静态成员,还是不够扩展)
*
*/
public static void getClassObject_2(){//对应方式2
Class clazz = Person.class;
Class clazz1 = Person.class;
System.out.println(clazz==clazz1);//true
}
/*
* 获取字节码文件对象的方式三【重点】:
*
* 只要通过给定的类的字符串名称就可以获取其Class对象,更为扩展。
* (可以用Class类中的方法完成)
* 打开API,点进java.lang包,找到Class类,其内描述:
* Class 类的实例表示正在运行的 Java 应用程序中的类和接口。
* 该类特有方法:
* public static Class<?> forName(String className) throws ClassNotFoundException
* 返回与带有给定字符串名的类或接口相关联的 Class 对象。
* (该方法自动寻找名称为className的类文件,并返回Class对象)
*
* 【注】这种方式只要有名称即可,更为方便,扩展性更强。
*/
public static void getClassObject_3() throws ClassNotFoundException{
/**
* 【注意】用方式3获取Class对象不需要导入Person包,因为className中指定的是字符串,即文件名称。
*/
String className = "Person";
//可以将上一行代码写入配置文件中,那么反射机制直接去配置文件中拿到名称即可获取对应的Class对象,即字节码文件。
Class clazz = Class.forName(className);
System.out.println(clazz);
/**
* 运行该程序抛出ClassNotFoundException,原因:
* 在当前文件夹下有.classpath文件,用Editplus打开后,发现Class.forName方法去src或者bin目录下找名称为className的类文件
* ,但是当前文件夹下的bin文件夹内确实有Person类,为什么会找不到?因为名称没写全,名称要带上路径。
*
* 将第78行改为String className = "bean.Person";即可
*
*/
}
}