*准备工作:
包结构:*
=======================
Person.java代码:
package com.atguigu.java;
public class Person {
String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public void show(){
System.out.println("我是一个show方法");
}
}
=======================
反射的引用:
package com.atguigu.java;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.junit.Test;
/*
* 反射的应用
*
*/
public class ReflectionTest {
/*
* 在反射之前,如何实例化Person类,并调用其内部结构
*/
@Test
public void test1(){
//1.创建Person类的对象
Person p1 = new Person();
System.out.println(p1);
//2.调用指定的属性
p1.name = "Tom";
//3.调用指定的方法
p1.setAge(12);
p1.show();
System.out.println(p1);
}
/*
* 反射的应用,完成与test1同样的操作
*
*/
@Test
public void test2() throws Exception{
Class clazz = Person.class;// PrintStream ps = System.out;
//1.创建Person类的对象
Person p = (Person)clazz.newInstance();
System.out.println(p);
//2.调用指定的属性
//Field field1 = clazz.getField("name");会报错
Field field1 = clazz.getDeclaredField("name");
//设置指定的p对象的field1属性的值
//f.set(Object obj,Object fieldValue):将obj对象的f属性设置为fieldValue
field1.set(p, "Tom");
System.out.println(p);
//f.get(Object obj):获取指定的obj对象的f属性值
System.out.println(field1.get(p));
//3.调用指定的方法
Method m1 = clazz.getDeclaredMethod("setAge",int.class);
//m.invoke(Object obj,Object ... paramValues):调用obj对象指定的m方法,将参数值设置为Object ... paramValues
m1.invoke(p, 20);
System.out.println(p);
}
}
===================================
获取Class类的实例的几种方式:
/*
* java.lang.Class类的理解
* 1.java反射机制的源头
* 2.java程序经过编译(javac.exe)以后,生成一个或多个字节码文件(.class)文件,接着通过
* java.exe命令将.class文件通过JVM的类的加载器加载到内存(缓存)中,一个字节码文件,就对应着一个
* 运行时类。
* 3.此时内存中的运行时类即为Class的一个实例。也就是说:一个Class实例就对应一个java运行时类
* 4.内存中的运行时类,是存放在内存的缓存区,当再次被调用时,不会重新加载。
*
* 如何获取java.lang.Class类的实例(掌握)
*
*/
@Test
public void test1() throws ClassNotFoundException{
Person p = new Person();//1.将Person类加载到内存中 2.调用其空参的构造器
Person p1 = new Person();//不会重新加载Person类,因为其已经存在于内存中
//方式一:直接调用运行时类的.class属性获取
Class clazz1 = Person.class;
System.out.println(clazz1);
//方式二:调用Class类的静态方法:forName(String className) --后续使用的较多
String className = "com.atguigu.java.Person";
Class clazz2 = Class.forName(className);
System.out.println(clazz2);
//方法三:调用运行时类对象的getClass()
Class clazz3 = p.getClass();
System.out.println(clazz3);
System.out.println(clazz1 == clazz2 && clazz1 == clazz3);//true
//方式四:使用类的加载器ClassLoader (了解)
Class clazz4 = this.getClass().getClassLoader().loadClass("com.atguigu.java.Person");
System.out.println(clazz4);
System.out.println(clazz4 == clazz1);
}