![](https://i-blog.csdnimg.cn/blog_migrate/3607a30111231d7724f15d12479b114d.gif)
1. 要操作的实体类
package com.jmh.entity;
import com.jmh.demo.E1;
import com.jmh.demo.I1;
import com.jmh.demo.I2;
import com.jmh.demo.I3;
public class Person extends E1 implements I1,I2,I3{
private String pid;//编号
private String pname;//姓名
private String psex;//性别
public Person() {
}
public Person(String pid, String pname, String psex) {
super();
this.pid = pid;
this.pname = pname;
this.psex = psex;
}
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public String getPsex() {
return psex;
}
public void setPsex(String psex) {
this.psex = psex;
}
@Override
public String toString() {
return "Person [pid=" + pid + ", pname=" + pname + ", psex=" + psex + "]";
}
@Override
public void text1() {
System.out.println("本类实现的I1接口的方法");
}
@Override
public void text3() {
System.out.println("本类实现的I2接口的方法");
}
//@Override
public void text2() {
System.out.println("本类实现的I3接口的方法");
}
}
2.该类所实现的父类,接口
package com.jmh.demo;
public class E1 {
}
-
接口 I1.class I2.class I3.class
package com.jmh.demo;
public interface I1 {
public static final String TEXT="111";
public void text1();
}
package com.jmh.demo;
public interface I2 {
public static final String TEXT="222";
public void text2();
}
package com.jmh.demo;
public interface I3 {
public static final String TEXT="333";
public void text3();
}
3.所演练的类
package com.jmh.demo;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import com.jmh.entity.Person;
public class Demo01 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException {
//获取类对象
Class cs = Class.forName("com.jmh.entity.Person");
//通过类对象获取person对象
Person stu = (Person)cs.newInstance();
//2 用Person类反射实例化对象,调用方法,读写属性
//2.1 读写所有属性值
//下面放了会报错 所有我放到了上面
Field[] fs = cs.getDeclaredFields();
//遍历
int i=0;
for (Field field : fs) {
i++;
//设置安全权限
field.setAccessible(true);
//设置值
field.set(stu, "通过反射设置值"+i);
//读取所有属性值
System.out.println("通过反射读取所有属性值="+field.get(stu));
}
//2.2调用方法
Method me=cs.getDeclaredMethod("text1");
//打开权限
me.setAccessible(true);
//调用方法
Object invoke = me.invoke(stu);
System.out.println("通过反射调用方法="+invoke);
//1.通过反射得到该类所有的属性和方法,父类和实现接口
//1.1通过反射得到所有的属性
Field[] declaredFields = cs.getDeclaredFields();
//开始遍历
for (Field field : declaredFields) {
//设置权限
field.setAccessible(true);
System.out.println("通过反射获取该类的所有的属性="+field.getName());
}
//1.2获取所有方法
Method[] declaredMethods = cs.getDeclaredMethods();
//开始遍历
for (Method method : declaredMethods) {
//设置安全权限
method.setAccessible(true);
//获取所有方法
System.out.println("通过反射获取该类的所有的方法="+method.getName());
}
//1.3获取父类和实现接口
Class[] interfaces = cs.getInterfaces();
//开始遍历
for (Class class1 : interfaces) {
System.out.println("通过反射获取该类的所有实现接口="+class1.getSimpleName());
}
//1.3.3获取所有父类
for (; cs != Object.class; cs = cs.getSuperclass()) {//向上循环 遍历父类
//开启权限
System.out.println("通过反射获取该类的所有继承的父类="+cs.getSimpleName());
}
}
}
最后给大家整理了一份大纲
1.什么是反射?
反射是java语言的一种机制,利用反射机制动态的实例化对象(构造函数)、读写属性、调用方法。
反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)
2. 类类
所有狗 狗类 Dog 狗对象 二哈
所有猫 猫类 Cat 猫对象 肥波
所有类 类类 java.lang.Class 类对象 特定类
3.如何得到类对象
一切反射相关的代码都从获得类对象开始
3种获取方式:
2.1 类名.class;
2.2 对象名.getClass();
2.3 Class.forName(全限定名/全路径名)(最常用)
注1:ClassNotFoundException(类名错|少jar包)
注2:同一类的、类对象只会创建一个
4.根据类得到类名(全限定名/全路径名)
1)cName.getName(); -->获取全限定名
2)cName.getSimpleName(); -->获取类名
3)cName.getPackage(); -->获取包名
5.根据类得到类的属性
Field field=cla.getField(“属性名”);
field.getName(); -->获取属性名
filed.getType(); -->获取属性类型
field.getModifiers(); -->获取属性访问修饰符
field.set(Object,Object); -->设置属性值,参数1:要设置属性所在对象;参数2:要设置的值;
field.get(Object); -->获取属性值,参数:要获取属性值的对象
clazz.getDeclaredField(“属性名”); -->获取单个属性(私有、公有、受保护、默认、静态)
clazz.getDeclaredFields(); -->获取所有属性(私有、公有、受保护、默认、静态)
6.根据类得到类的方法
//无参无返回、无参有返回、有参无返回、有参有返回
cla.getMethod(); -->获取单个公有方法
cla.getDeclaredMethod(); -->获取当个方法(包括私有、受保护、默认、公有)
cla.getMethods(); -->获取所有公有方法
cla.getDeclaredMethods(); -->获取所有的方法(包括私有、受保护、默认、公有)
7.根据类得到类的构造方法
cla.getConstrutor(); -->获取单个公有构造方法
cla.getDeclaredConstrutor(); -->获取单个构造方法(包括私有、受保护、默认、公有)
cla.getConstrutors(); -->获取所有的公有构造方法
cla.getDeclaredConstrutors(); -->获取所有的构造方法(包括私有、受保护、默认、公有)
8.根据类得到类的实现接口列表
Class[] interface=cla.getInterfaces(); -->获取类对象中所有实现接口列表
![](https://i-blog.csdnimg.cn/blog_migrate/5f4c708afcfe7d9d7ec021c557d3dee5.jpeg)