* 什么是反射:
* 通过类的加载(类加载器加载一些扩展包以及java核心包)--->
* 产生一个Class类对象(字节码文件对象)--->通过字节码文件获取类中的成员:
* 成员变量:Field
* 成员方法:Method
* 构造方法:Constructor
*
* 获取字节码文件对象的方式有几种?
* 1)通过Object类的getClass获取
* 2)任意Java类型的class属性
* 3)Class类中,提供了一个静态方法
* public static Class forName(String className)
* 形式参数是一个字符串类型,所以经常将参数的内容放置配置文件中获取
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException {
//Class类:正在运行Java类对象
// 创建一个Person类对象
Person p1=new Person("张三",50);
Person p2=new Person("张三",50);
System.out.println(p1==p2);
// 1)通过Object类的getClass获取
Class c1=p1.getClass();
System.out.println(c1);
Class c2=p2.getClass();
System.out.println(p2);
System.out.println(c1==c2);
System.out.println("----------");
// 2)任意Java类型的class属性
Class c3=Person.class;
System.out.println(c3);
System.out.println("----------");
// 3)Class类中,提供了一个静态方法
Class c4=Class.forName("com.lin_reflect_01.Person");
// 参数为类的完全限定名称:包名、类名
System.out.println(c4);
}
}
public class Person {
private String name ;//姓名
int age ;
public String address ;
//构造方法
//公共无参构造
public Person() {
}
//私有的带一个参数的构造方法
private Person(String name) {
this.name = name ;
}
//单两个参数的,默认修饰符的构造方法
Person(String name,int age){
this.name = name ;
this.age = age ;
}
//公共的带三个参数的构造方法
public Person(String name,int age,String address) {
this.name = name ;
this.age = age ;
this.address = address;
}
//提供一个成员方法
public void show() {
System.out.println("show Person...");
}
public String function() {
return "hello" ;
}
public String method(int num) {
return "JavaEE"+num ;
}
private void function2(String str) {
System.out.println(str);
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
}
}