概述
反射的概念
JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制
Java反射有三个动态性质:
1、运行时生成对象实例
2、运行期间调用方法
3、运行时更改属性
通过这些动态性质,JAVA反射可以在程序运行时获取对象和类的真实信息。
Java反射可以实现的功能:
1、在运行时判断任意一个对象所属的类
2、在运行时构造任意一个类的对象
3、在运行时判断任意一个类所具有的方法和属性
4、在运行时调用任意一个对象的方法
5、生成动态代理
与Java反射相关的类如下:
类名 | 用途 |
---|---|
Class类 | 代表类的实体,在运行的Java应用程序中表示类和接口 |
Field类 | 代表类的成员变量(成员变量也称为类的属性) |
Method类 | 代表类的方法 |
Constructor类 | 代表类的构造方法 |
Class类
假如现在有一个私有的student 方法 想调用这个方法就可以使用反射
一个student 类如下
public class Student {
private String name;
private int age;
private Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student(){
throw new IllegalAccessError("就不给你创建");
}
private String getName() {
return name == null ? "" : name;
}
private 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 "Student{" +
"name='" + name + ''' +
", age=" + age +
'}';
}
}
实现如下
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Fine{
public static void main(String[] args){
Class<?> clz = null;
try {
clz = Class.forName("Student");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 找到带有这个参数的构造方法
Constructor constructor = null;
try {
constructor = clz.getDeclaredConstructor(String.class, int.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
constructor.setAccessible(true);
// 初始化对象
Object student = null;
try {
student = constructor.newInstance("张三", 18);
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
System.out.println("--------------"+constructor.toString());
// 找到该私有方法
Method getName = null;
try {
getName = clz.getDeclaredMethod("getName");
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
getName.setAccessible(true);
String name = null;
try {
name = (String) getName.invoke(student);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println("--------------"+name);
// 找到私有属性
Field age = null;
try {
age = clz.getDeclaredField("age");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
age.setAccessible(true);
try {
age.setInt(student, 20); // 修改属性
} catch (IllegalAccessException e) {
e.printStackTrace();
}
try {
System.out.println("--------------"+age.get(student));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
输出结果:
最后
以上就是听话秋天为你收集整理的Java 反射 (快速了解反射)的全部内容,希望文章能够帮你解决Java 反射 (快速了解反射)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复