1.什么是JAVA的反射机制
java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性。
2.JAVA的反射机制的作用
用来编写一些通用性较高的代码或者框架的时候使用
Class
Class类的实例表示正在运行的Java应用程序中的类的接口
——已知类和对象的情况下
类名.class
对象.getClass()--------------Object类提供
——未知类和对象的情况下
Class.forName("包名.类名")
Constructor
关于类的单个构造方法的信息以及对它的访问权限
Field
提供有关类或接口的单个字段信息,以及对它的动态访问权限
Method
提供关于类或接口上单独某个方法的信息
对应关系
案例代码
1.目录结构
2.Person类
package com.imooc.reflect.test;
public class Person {
public String name;
private String sex;
public Person() {
super();
}
public Person(String name, String sex) {
super();
this.name = name;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public void eat(){
System.out.println("吃-----------");
}
private void run(){
System.out.println("跑-----------");
}
private void studt(String name){
System.out.println(name+"在学习-------------");
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
3.ClassTest
package com.imooc.reflect.test;
import org.junit.Test;
public class ClassTest {
@Test
/**
* 获得Class对象
* 1.通过类名.class
* 2.对象.getClass()
* 3.Class.forName()------推荐
*/
public void demo1() throws ClassNotFoundException {
//1.通过类名.class的方式
Class class1 = Person.class;
//2.通过对象.getClass()的方式
Person person = new Person();
Class class2 = person.getClass();
//3.Class类forName();获得(推荐)
Class class3 = Class.forName("com.imooc.reflect.test.Person");
}
}
4.ConstructorTest
package com.imooc.reflect.test;
import org.junit.Test;
import java.lang.reflect.Constructor;
public class ConstructorTest {
@Test
/**
* 获得无参数的构造方法
*/
public void demo1() throws Exception {
//获得类的字节码对应的对象
Class class1 = Class.forName("com.imooc.reflect.test.Person");
//得到一个无参的构造方法
Constructor c = class1.getConstructor();
Person person = (Person) c.newInstance();//相当于Person person = new Person();
person.eat();
}
@Test
/**
* 获得有参数的构造方法
*/
public void demo2() throws Exception {
//获得类的字节码对应的对象
Class class1 = Class.forName("com.imooc.reflect.test.Person");
//获得有参构造
Constructor c = class1.getConstructor(String.class,String.class);
Person person = (Person) c.newInstance("张三", "男");// 相当于Person person = new Person("张三", "男");
System.out.println(person);
}
}
5.FieldTest
package com.imooc.reflect.test;
import org.junit.Test;
import java.lang.reflect.Field;
public class FieldTest {
@Test
/**
* 测试公有属性
*/
public void demo1() throws Exception {
//获得Class
Class class1 = Class.forName("com.imooc.reflect.test.Person");
//获得公有属性
Field field = class1.getField("name");
//新建对象
Person p = (Person)class1.newInstance();
//操作属性
field.set(p,"李四");
String name = (String)field.get(p);
System.out.println(name);
}
@Test
/**
* 测试私有属性
*/
public void demo2() throws Exception {
//获得Class
Class class1 = Class.forName("com.imooc.reflect.test.Person");
//获得私有属性
Field field = class1.getDeclaredField("sex");
//新建对象
Person p = (Person) class1.newInstance();
//私有属性需要设置可访问权限
field.setAccessible(true);
//操作属性
field.set(p,"男");
//获取值
Object obj = field.get(p);
System.out.println(obj);
System.out.println(p);
}
}
6.MethodTest
package com.imooc.reflect.test;
import org.junit.Test;
import java.lang.reflect.Method;
public class MethodTest {
@Test
/**
*测试公有方法
*/
public void demo1() throws Exception {
//获得Class
Class class1 = Class.forName("com.imooc.reflect.test.Person");
//实例化对象
Person person = (Person) class1.newInstance();
//获得公有的无参方法
Method method = class1.getMethod("eat");
//调用该方法
method.invoke(person);
}
@Test
/**
*测试私有方法
*/
public void demo2() throws Exception {
//获得Class
Class class1 = Class.forName("com.imooc.reflect.test.Person");
//实例化对象
Person person = (Person) class1.newInstance();
//获得方法
Method method = class1.getDeclaredMethod("run");
//设置私有方法访问权限
method.setAccessible(true);
//调用方法
method.invoke(person);
}
@Test
/**
*测试私有的带参数的方法
*/
public void demo3() throws Exception {
//获得Class
Class class1 = Class.forName("com.imooc.reflect.test.Person");
//实例化对象
Person person = (Person) class1.newInstance();
//获得私有的带参数的方法
Method method = class1.getDeclaredMethod("studt", String.class);
//设置私有方法的访问权限
method.setAccessible(true);
//执行私有的带参数的方法
method.invoke(person,"张三");
}
}