java 反射
程序员文章站
2024-01-21 14:37:04
...
Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性和方法。
Java类中的反射就是把类中的属性和方法映射成相应的类.
Java的类反射所需要的类,它们分别是:Field、Constructor、Method、Class.
反射的三种实现方法:
1. 类名.class
2.对象名.getClass()
3.Class.forName("类的完整名称")
Class.forName的作用,如果虚拟机内存中不存在该类的字节码则由类加载器载,虚拟机内存中存在就直接返回。一个类的字节码在内存中只有唯一的一份。
取的字节码的三种方式
String.class;
String.getClass();
Class.forName("java.lang.String");
1.通过反射取的String类的实例对象
import java.lang.reflect.Constructor;
public class ReflectDemo01 {
public static void main(String args[]) throws Exception{
Constructor strConstructor = String.class.getConstructor(String.class);
String str = (String)strConstructor.newInstance(new Object[]{"123"});
System.out.println(str);
}
}
2.通过反射调用String类的charAt(int index)方法
import java.lang.reflect.Method;
public class ReflectDemo01 {
public static void main(String args[]) throws Exception{
String str = "TestReflect";
//Method charAt = str.getClass().getMethod("charAt",int.class);
Method charAt = String.class.getMethod("charAt",int.class);
System.out.println(charAt.invoke(str,0));
}
}
3.通过反射调用String类的静态方法valueOf(boolean b);
import java.lang.reflect.Method;
public class ReflectDemo02 {
public static void main(String args[]) throws Exception{
Method valueOf = String.class.getMethod("valueOf",boolean.class);
/**调用时传null,因为静态方法不属于对象**/
System.out.println(valueOf.invoke(null,true));
}
}
4.用反射返回类的属性
import java.lang.reflect.Field;
public class ReflectDemo03 {
public static void main(String args[]) {
/**
返回类所声明的属性(成员变量), 包括私有属性
**/
Field[] allFields = Student.class.getDeclaredFields();
for(Field field:allFields){
if(field.getType() == String.class){
System.out.println(field.getGenericType());
}
if(field.getType() == Integer.TYPE){
System.out.println(field.getGenericType());
}
}
/**
返回类所声明可访问的公共属性
**/
Field[] pubFields = Student.class.getFields();
for(Field field:pubFields){
if(field.getType() == String.class){
System.out.println(field.getGenericType());
}
if(field.getType() == Integer.TYPE){
System.out.println(field.getGenericType());
}
}
}
}
class Student {
public String name;
private int age;
}
5.通过反射修改类的私有属性
import java.lang.reflect.Field;
public class ReflectDemo04 {
public static void main(String[] args) throws Exception{
Student student = new Student("小华",16);
System.out.println(student);
/**
返回类中所有声明的属性,目前只能让你看到,不能够使用.
也可以通过getDeclaredField(String name)查看某一个属性的声明(包括私有属性).
**/
Field []prvFields = student.getClass().getDeclaredFields();
for(Field prvField:prvFields) {
if(prvField.getType() == String.class){
/**
取消Java 语言默认的访问控制检查
**/
prvField.setAccessible(true);
prvField.set(student,"小猪");
}
if(prvField.getType() == Integer.TYPE) {
/**
取消Java 语言默认的访问控制检查
**/
prvField.setAccessible(true);
prvField.setInt(student,18);
}
}
System.out.println(student);
}
}
class Student {
private String name;
private int age;
public Student(String name,int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "姓名:"+this.name + " 年龄:"+this.age;
}
}
上一篇: 在LINUX上创建GIT服务器
下一篇: 设计模式:工厂模式