文章目录
概述
1.1什么是反射?
Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。
1.2 反射用途
在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法。
JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。
2反射机制的相关类(class 和 Class )
类名 | 用途 |
---|---|
Class类 | 代表类的实体,在运行的Java应用程序中表示类和接口 |
Field类 | 代表类的成员变量 |
Method类 | 代表类的方法 |
Constructor类 | 代表类的构造方法 |
2.1Class类
Class 和 class 的区别: class是JAVA中的关键字用于定义一个类,Class是JAVA中的一个类,用于在反射技术的时候,映射普通类型的所有信息
Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选 准正确方法去执行,用来保存这些类型信息的类是Class类。
换言之:除了int等基本类型外,Java的其他类型全部都是Class(包括interface)。例如:(String,Object,Runnable,Exception,…)仔细思考,我们可以得出结论:class(包括interface)的本质是数据类型(Type)每个类(型)都有一个Class对象。
Class类是所有类型的类,任何一个类型都可以认为是Class类的一个对象
Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。
P p = new Teacher(); p 编译期间为P类型运行期间为Teacher类型
在这个类中提供了很多有用的方法,这里对他们简单的分类介绍。
2.1.1获得类相关的方法
2.1.2 获得类中属性相关的方法
2.1.3 获得类中注解相关的方法
2.1.4 获得类中构造器相关的方法
2.1.5 获得类中方法相关的方法
2.1.6 类中其他重要方法
2.2Field类
2.3Method类
3反射的三种方式
方式一(通过对象的getClass()方法获取)
方式二(通过类的.class 属性获取)
方式三(通过Class.forName方法获取)
方式一,已经创建了对象,那么这个时候就不需要去进行反射了,显得有点多此一举。
方式二,需要导入类的包,依赖性太强。
所以我们一般选中方式三。
3.1获取类的构造方法
Constructor<?>[] getConstructors() 取得public的构造函数
Constructor<?>[] getDeclaredConstructors() 取得所有的构造函数
Constructor<T> getConstructor(Class<?>… parameters)
Constructor<T> getDeclaredConstructor(Class<?>… parameters)
3.2 获取类属性
Field[] getDeclaredFields()
取得所有当前类自己定义的属性,包括四种访问权限的
Field[] getFields()
取得所有public的属性,包括继承的,接口中声明的和自己定义的
Field getDeclaredField(String)
根据名称取得所有当前类自己定义的属性,包括四种访问权限的
Field getFields()
根据名称获取取得所有public的属性,包括继承的,接口中声明的和自己定义的
3.3获取类中的方法
public Method[] getDeclaredMethods() throws Exception
取得所有当前类声明的方法,包括public,protected,默认,private四种访问权限的方法,但是不包括继承的方法
public Method[] getMethods() throws Exception
取得所有public的方法,包括继承的,接口中声明的和自己定义的
反射举例
package com.xja.ssm.jingpai.test;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test3 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
@SuppressWarnings("rawtypes")
Class student=Class.forName("com.ssm.jingpai.bean.Student");
Object o=student.newInstance();
Field[] Fields = student.getDeclaredFields();
for (Field field : Fields) {
if(field.getName().equals("name")) {
field.set(o, "张三");
}
}
Method sexmethod=student.getDeclaredMethod("setSex", String.class);
sexmethod.invoke(o, "男");
Method[] declaredMethods = student.getDeclaredMethods();
for (Method method : declaredMethods) {
if("BookRead".equals(method.getName())) {
method.invoke(o, "《三体》");
}
if("ShowInfo".equals(method.getName())) {
method.invoke(o, null);
}
if("getScore".equals(method.getName())) {
System.out.println("张三的物理成绩为:"+method.invoke(o, "物理"));
}
}
}
}
package com.xja.ssm.jingpai.bean;
public class Student {
public String name;
private String Sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return Sex;
}
public void setSex(String sex) {
Sex = sex;
}
public void ShowInfo() {
System.out.println("姓名:"+this.name+","+"性别:"+this.Sex);
}
public void BookRead(String BookName) {
System.out.println(this.name+"正在读"+BookName);
}
public int getScore(String course) {
int num=0;
if(course=="语文") {
num=100;
return num;
}
if(course=="物理") {
num=99;
return num;
}
return num;
}
}