Java之反射(reflect)示例简介说明
下文笔者通过示例的方式,讲述反射(reflect)的用法,如下所示
反射获取方法,并运行方法
反射(reflect)示例
反射的功能:
用于获取字节码(Class对象)
对于任意类,我们都可以使用反射获取类的所有属性和方法
并且可以运行其中的方法和获取属性
注意事项:
反射是在java运行时
动态获取类相关信息
获取Java反射类信息的方法
1.使用Class类的静态方法forName
Class.forName("java.lang.String");
2.使用类的.class语法
String.class;
3.使用对象的getClass()方法
String str = "java265";
Class<?> strClass = str.getClass();
例:
import java.lang.reflect.Method;
public class TestClass {
public static void main(String[] args) throws Exception {
// 方式一
// Class<?> classType = Class.forName("java.lang.String");
// 方式二
// Class<?> classType = String.class;
// 方式三
String str = "java265";
Class<?> classType = str.getClass();
Method[] methods = classType.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
}
}
------运行以上代码,将输出以下信息-----
...
public java.lang.String java.lang.String.toUpperCase(java.util.Locale)
public java.lang.String java.lang.String.trim()
反射获取类信息
下文笔者讲述使用反射获取类信息的方法分享
如下所示
1.使用反射机制获取类的构造函数
然后使用构造函数创建类的实例
使用类的不带参数的构造方法来生成对象
有以下两种方式
1.1 先获得Class对象
然后通过该Class对象的newInstance()方法
直接生成即可
Class<?> classType = String.class;
Object obj = classType.newInstance();
1.2:先获得Class对象
然后通过该对象获得对应的Constructor对象
再通过该Constructor对象的newInstance()方法生成类对象
Class<?> classType = Customer.class;
Constructor cons = classType.getConstructor(newClass[]{});
Object obj = cons.newInstance(newObject[]{});
如果使用类的带参数的构造方法生成对象,可使用下面的方式
Class<?> classType = Customer.class;
Constructor cons = classType.getConstructor(newClass[]{String.class,int.class});
Object obj = cons.newInstance(newObject[]{"java265.com",8888});
反射使用构造函数生成类对象的方法分享
import java.lang.reflect.Constructor;
public class ReflectTest {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("reflex.Person");
Constructor<Person> constructor1 = clazz.getConstructor();
Constructor<Person> constructor2 = clazz.getConstructor(String.class);
// 无参方式一
Person person11 = (Person) clazz.newInstance();
// 无参方式二
Person person12 = constructor1.newInstance();
// 有参方式
Person person2 = constructor2.newInstance("java265");
}
}
class Person {
public Person() {
System.out.println("我是奥特曼");
}
public Person(String name) {
System.out.println("我是:" + name);
}
}
------运行以上代码,将输出以下信息-----
我是奥特曼
我是奥特曼
我是:java265
使用反射机制获取类属性
1.获取class类: Class<?> classType = InvokeTester.class;
2.实例化: Object invokeTester = classType.newInstance();
3.获取field
public字段: Field publicField = clazz.getField("age");
private字段: Field privateField = clazz.getDeclaredField("name");
4.赋值:
public字段: publicField.set(person, 20);
private字段: privateField.setAccessible(true); // 对私有字段的访问取消检查
privateField.set(person, "tony");
5.获取值: privateField.get(person)
例:
import java.lang.reflect.Field;
public class ReflectTest {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("reflex.Person");
Person person = (Person) clazz.newInstance();
// public字段
Field publicField = clazz.getField("age");
publicField.set(person, 18);
System.out.println(publicField.get(person));
// private字段
// Field privateField = clazz.getField("name"); //java.lang.NoSuchFieldException
Field privateField = clazz.getDeclaredField("name");
privateField.setAccessible(true); // 对私有字段的访问取消检查
privateField.set(person, "tony");
System.out.println(privateField.get(person));
}
}
class Person {
public int age;
private String name;
public Person() {
System.out.println("我是奥特曼");
}
public Person(String name) {
System.out.println("我是:" + name);
}
}
使用反射机制获取类的方法,并运行方法
实现步骤:
1.获取class类: Class<?> classType = InvokeTester.class;
2.实例化: Object invokeTester = classType.newInstance();
3.获取方法: Method addMethod = classType.getMethod("add", new Class[]{int.class, int.class});
4.调用方法: Object addResult = addMethod.invoke(invokeTester, new Object[]{1, 2});
例:反射获取方法,并运行方法
import java.lang.reflect.Method;
public class InvokeTester{
public int add(int param1, int param2){
return param1 + param2;
}
public String echo(String message){
return "hello: " + message;
}
public static void main(String[] args) throws Exception{
Class<?> classType = InvokeTester.class;
Object invokeTester = classType.newInstance();
Method addMethod = classType.getMethod("add", new Class[]{int.class, int.class});
Object addResult = addMethod.invoke(invokeTester, new Object[]{1, 2});
System.out.println((Integer)addResult);
Method echoMethod = classType.getMethod("echo", new Class[]{String.class});
Object echoResult = echoMethod.invoke(invokeTester, new Object[]{"java2655"});
System.out.println((String)echoResult);
}
}
使用反射复制对象
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectTester {
// 该方法实现对Customer对象的拷贝操作
public Object copy(Object object) throws Exception{
Class<?> classType = object.getClass();
Object objectCopy = classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
Field[] fields = classType.getDeclaredFields();
for (Field field : fields) {
String name = field.getName();
String firstLetter = name.substring(0, 1).toUpperCase(); // 将属性的首字母转换为大写
String getMethodName = "get" + firstLetter + name.substring(1);
String setMethodName = "set" + firstLetter + name.substring(1);
Method getMethod = classType.getMethod(getMethodName, new Class[]{});
Method setMethod = classType.getMethod(setMethodName, new Class[]{ field.getType() });
Object value = getMethod.invoke(object, new Object[]{});
setMethod.invoke(objectCopy, new Object[]{ value });
}
return objectCopy;
}
public static void main(String[] args) throws Exception{
Customer customer = new Customer("test", 20);
customer.setId(1L);
ReflectTester test = new ReflectTester();
Customer customer2 = (Customer) test.copy(customer);
System.out.println(customer2.getId() + "," + customer2.getName() + ","+ customer2.getAge());
}
}
class Customer{
private Long id;
private String name;
private int age;
public Customer() {
}
public Customer(String name, int age) {
this.name = name;
this.age = age;
}
public Long getId() {return id;}
public void setId(Long id) {this.id = id;}
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;}
}
反射操作数组
import java.lang.reflect.Array;
public class ArrayTester1 {
public static void main(String[] args) throws Exception{
Class<?> classType = Class.forName("java.lang.String");
Object array = Array.newInstance(classType, 10);
Array.set(array, 88, "java265");
String str = (String)Array.get(array,88);
System.out.println(str);
}
}
反射运行对象的私有方法
public class Private{
private String testFun(String name){
return "hello: " + name;
}
}
import java.lang.reflect.Method;
public class TestPrivate{
public static void main(String[] args) throws Exception{
Private p = new Private();
Class<?> classType = p.getClass();
Method method = classType.getDeclaredMethod("testFun",
new Class[] { String.class });
method.setAccessible(true);//设置Java的访问控制检查
String str = (String)method.invoke(p, new Object[]{"java265"});
System.out.println(str);
}
}
反射调用对象的get方法
public class Private2{
private String name = "java265";
public String getName(){
return name;
}
}
import java.lang.reflect.Field;
public class TestPrivate2{
public static void main(String[] args) throws Exception{
Private2 p = new Private2();
Class<?> classType = p.getClass();
Field field = classType.getDeclaredField("name");
field.setAccessible(true);//压制Java对访问修饰符的检查
field.set(p, "lisi");
System.out.println(p.getName());
}
}
获取已知class父类
public class ClassTest {
public static void main(String[] args) {
Class<?> classType = Child.class;
System.out.println(classType);
classType = classType.getSuperclass();
System.out.println(classType);
classType = classType.getSuperclass();
System.out.println(classType);
classType = classType.getSuperclass();
System.out.println(classType);
}
}
class Parent{}
class Child extends Parent{}
运行结果:
class com.java265.Child
class com.java265.Parent
class java.lang.Object
null
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


