一、什么反射
以上内容来自于百度百科
二、反射的作用
反射总结起来就一句话获取信息。
我们可以通过反射可以获取以下信息:
- Class对象
- 构造器
- 方法
- 私有变量与私有方法
- 注解
- 泛型
- 数组
接下来上代码,准备工作:
1.导依赖
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
2.建一个Person类(父类)
package javaclassdemo.entity;
public class Person {
String name;
int age;
public Person(String name, int age) {
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 +
'}';
}
}
3.建一个接口(PersonMapper)
package javaclassdemo.mapper;
public interface PersonMapper {
//这个方法仅用于测试使用。
public void test();
}
4.建一个Student类(这个类继承Person父类,并且实现PersonMapper接口)
package javaclassdemo.mapper.impl;
import javaclassdemo.entity.Person;
import javaclassdemo.mapper.PersonMapper;
public class Student extends Person implements PersonMapper {
private String className;
private String address;
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Student(String name, int age) {
super(name, age);
}
//这个方法是实现的接口里的方法
public void test() {
}
}
5.建一个TestAttributes类(这个类用于测试反射的各种方法)
方法一:获取对象的属性
package javaclassdemo.controller;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class TestAttributes {
public static void main(String[] args) {
Class stu=null;
try {
stu = Class.forName("javaclassdemo.entity.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 获取对象的所有公有属性。
Field[] fields = stu.getFields();
for (Field f : fields) {
System.out.println(f);
}
System.out.println("---------------------");
// 获取对象所有属性,但不包含继承的。
Field[] declaredFields = stu.getDeclaredFields();
for (Field ff : declaredFields) {
System.out.println(ff);
}
}
}
运行结果:
方法二:获得方法
package javaclassdemo.controller;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class TestAttributes {
public static void main(String[] args) {
Class stu=null;
try {
stu = Class.forName("javaclassdemo.entity.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 获取对象的所有公共方法
Method[] methods = stu.getMethods();
for (Method m : methods) {
System.out.println(m);
}
System.out.println("---------------------");
// 获取对象所有方法,但不包含继承的
Method[] declaredMethods = stu.getDeclaredMethods();
for (Method ms : declaredMethods) {
System.out.println(ms);
}
}
}
方法三:获得构造方法
package javaclassdemo.controller;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class TestAttributes {
public static void main(String[] args) {
Class stu=null;
try {
stu = Class.forName("javaclassdemo.entity.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 获取对象所有的公共构造方法
Constructor[] constructors = stu.getConstructors();
for (Constructor c : constructors) {
System.out.println(c);
}
System.out.println("---------------------");
// 获取对象所有的构造方法
Constructor[] declaredConstructors = stu.getDeclaredConstructors();
for (Constructor con : declaredConstructors) {
System.out.println(con);
}
}
}
方法四:获得其它
package javaclassdemo.controller;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class TestAttributes {
public static void main(String[] args) {
Class stu=null;
try {
stu = Class.forName("javaclassdemo.entity.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println(stu.getName());//获取对象全限定名称
System.out.println(stu.getPackage());// 获取包名
Class[] interfaces = stu.getInterfaces();//获取该类实现的所有接口
for (Class in : interfaces) {
System.out.println(in);
}
}
}