简介
本文用示例介绍Java反射的应用。
调用类的方法
package org.example.a;
import java.lang.reflect.Method;
class Human {
private String name;
private Integer age;
public Human() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public void sayCategory() {
System.out.println("HUMAN");
}
public String sayHello(String name, Integer age) {
return "名字:" + name + " " + "年龄:" + age;
}
}
public class Demo {
public static void main(String[] args) {
Class<?> c = null;
try {
c = Class.forName("org.example.a.Human");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
Method method = c.getMethod("sayHello", String.class, Integer.class);
System.out.println(method.invoke(c.newInstance(), "Tony", 20));
} catch (Exception e) {
e.printStackTrace();
}
}
}
执行结果
名字:Tony 年龄:20
修改属性
package com.example.a;
import java.lang.reflect.Field;
public class Demo {
public static void main(String[] args) {
User user = new User();
try {
Class<? extends User> aClass = user.getClass();
Field nameField = aClass.getDeclaredField("name");
nameField.setAccessible(true); //将name属性设置成可被外部访问
nameField.set(user, "Tony"); //设置name属性内容
System.out.println(user.getName());
// 也可以这么写:
// System.out.println(nameField.get(user));
nameField.setAccessible(false); //将name属性设置成不可被外部访问
} catch (Exception e) {
e.printStackTrace();
}
}
}
class User {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public void sayCategory() {
System.out.println("HUMAN");
}
public String sayHello(String name, Integer age) {
return "名字:" + name + " " + "年龄:" + age;
}
}
执行结果
Tony
获取父类属性
反射只能操作本类的private属性,无法操作父类的private属性。如果想操作父类的,需要通过getSuperClass获得父类,然后再操作。
package com.example.a;
import java.lang.reflect.Field;
public class Demo {
public static void main(String[] args) {
User user = new User();
user.setId(3L);
user.setUserName("Tony");
user.setCurrent(4);
user.setPageSize(20);
System.out.println("------ Class的getDeclaredFields ------");
Class<? extends User> aClass = user.getClass();
Field[] declaredFields = aClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField.getName());
}
System.out.println("------ Class的getSuperClass的getDeclaredFields ------");
Class<?> superclass = aClass.getSuperclass();
Field[] superFields = superclass.getDeclaredFields();
for (Field declaredField : superFields) {
String name = declaredField.getName();
System.out.println(name);
}
}
}
class PageRequest {
private Integer current = 0;
private Integer pageSize = 10;
public Integer getCurrent() {
return current;
}
public void setCurrent(Integer current) {
this.current = current;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
}
class User extends PageRequest{
private Long id;
private String userName;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
结果
------ Class的getDeclaredFields ------ id userName ------ Class的getSuperClass的getDeclaredFields ------ current pageSize
操作数组
例1:取得数组信息并修改数组内容
package org.example.a;
import java.lang.reflect.Array;
public class Demo {
public static void main(String[] args) {
int temp[] = {1, 2, 3};
Class<?> c = temp.getClass().getComponentType();
System.out.println("类型:" + c.getName());
System.out.println("长度:" + Array.getLength(temp));
System.out.println("第一个内容:" + Array.get(temp, 0));
Array.set(temp, 0, 6);
System.out.println("第一个内容:" + Array.get(temp, 0));
}
}
执行结果
类型:int 长度:3 第一个内容:1 第一个内容:6
例2:修改数组的大小
package org.example.a;
import java.lang.reflect.Array;
public class Demo {
public static void main(String[] args) {
int temp[] = {1, 2, 3};
int newTemp[] = (int[]) arrayInc(temp, 5);
print(newTemp);
System.out.println("---------------------------");
String str[] = {"abc", "def", "gh"};
String newStr[] = (String[]) arrayInc(str, 8);
print(newStr);
}
public static Object arrayInc(Object obj, int len) {
Class<?> c = obj.getClass();
Class<?> arr = c.getComponentType();
Object newO = Array.newInstance(arr, len);
int co = Array.getLength(obj);
System.arraycopy(obj, 0, newO, 0, co);
return newO;
}
public static void print(Object obj) {
Class<?> c = obj.getClass();
if (!c.isArray()) {
return;
}
Class<?> arr = c.getComponentType();
System.out.println(arr.getName() + "数组长度是:" + Array.getLength(obj));
for (int i = 0; i < Array.getLength(obj); i++) {
System.out.println(Array.get(obj, i) + "、");
}
}
}
执行结果
int数组长度是:5 1、 2、 3、 0、 0、 --------------------------- java.lang.String数组长度是:8 abc、 def、 gh、 null、 null、 null、 null、 null、


请先 !