最近了解了一下Java反射用法,下面是一些简单的总结
一 、反射首先要获取类的class文件,获取Class文件的三种方法
1 、User.getClass()
2 、User.class
3 、Class.forName("boot.demo.invoke.User")
二 、反射中经常用到的方法
获取到Class类的对象之后,可以解析出这个class文件中对应的成员,解析出来的所有成员都会被封装成不同的对象。
1、反射构造方法,返回的是Constructor对象
反射类中公开的构造方法
getConstructor(构造方法参数列表类型 )
getConstructors()
反射类中私有的构造方法:
getDeclaredConstructor(构造方法参数列表类型)
getDeclaredConstructors()
2 、反射类中的成员变量,返回Field对象
反射公开的成员变量
getField(变量名 )
getFields()
反射私有的成员变量
getDeclaredField(变量名)
getDeclaredFields()
3 、反射类中的成员方法
反射公开的方法
getMethod(方法名,方法的参数列表的类型)
getMethods()
反射私有的方法
getDeclaredMethod(方法名,方法的参数列表的类型)
getDeclaredMethods();
三 、每个方法的例子
1、反射公开构造器
public static void main(String[] args) throws Exception {
// 获取class文件
Class<?> calssUser = Class.forName("boot.demo.invoke.User");
// 获取构造器对象
Constructor<?> constructor = calssUser.getConstructor(String.class, String.class);
// 用构造器创建新实例
Object newInstance = constructor.newInstance("001", "wade");
// 输出
System.out.println(newInstance);
}
结果:User [userId=001, userName=wade]
2、反射私有的构造器
public static void main(String[] args) throws Exception {
// 获取class文件
Class<?> calssUser = Class.forName("boot.demo.invoke.User");
// 获取构造器对象
Constructor<?> constructor = calssUser.getDeclaredConstructor(String.class);
// Accessible属性设置为true
constructor.setAccessible(true);
// 用构造器创建新实例
Object newInstance = constructor.newInstance("wade");
// 输出
System.out.println(newInstance);
}
结果:
User [userId=null, userName=wade]
这里注意要加一行代码把构造器属性accessible设置为true,否则报错
Exception in thread "main" java.lang.IllegalAccessException: Class boot.demo.invoke.Demo can not access a member of class boot.demo.invoke.User with modifiers "private"
3、反射公开非静态成员变量
public static void main(String[] args) throws Exception {
// 获取class文件
Class<?> calssUser = Class.forName("boot.demo.invoke.User");
// 获取成员变量对象
Field field = calssUser.getField("userName");
// new一个实例
Object newInstance = calssUser.newInstance();
// field set第一个是需要依赖的对象实例,第二个是变量值
field.set(newInstance, "wade");
// 输出
System.out.println(newInstance);
}
结果:User [userId=null, userName=wade]
4、反射私有静态成员变量
public static void main(String[] args) throws Exception {
// 获取class文件
Class<?> calssUser = Class.forName("boot.demo.invoke.User");
// 获取成员变量对象
Field field = calssUser.getDeclaredField("nickName");
// 取消权限检查
field.setAccessible(true);
// field set静态不需要依赖对象实例,第二个是变量值
field.set(null, "The Flash");
// new一个实例
Object newInstance = calssUser.newInstance();
// 输出
System.out.println(newInstance);
}
结果:User [userId=null, userName=null, nickName=The Flash]
5、反射公开非静态成员方法
public static void main(String[] args) throws Exception {
// 获取class文件
Class<?> calssUser = Class.forName("boot.demo.invoke.User");
// 获取方法对象
Method method = calssUser.getMethod("speak", String.class);
// new一个实例
Object newInstance = calssUser.newInstance();
// method invoke第一个是需要依赖对象实例,第二个是方法的参数
Object invoke = method.invoke(newInstance, "this is my house");
// 输出
System.out.println(invoke);
}
结果:this is my house
6、反射私有静态成员方法
public static void main(String[] args) throws Exception {
// 获取class文件
Class<?> calssUser = Class.forName("boot.demo.invoke.User");
// 获取方法对象
Method method = calssUser.getDeclaredMethod("speak2", String.class, String.class);
// 取消权限检查
method.setAccessible(true);
// method invoke第一个是需要依赖对象实例,第二个是方法的参数
Object invoke = method.invoke(null, "I am the best one", "##heihei");
// 输出
System.out.println(invoke);
}
结果:I am the best one##heihei
例子中的类
/**
* anji-allways.com Inc.
* Copyright (c) 2016-2017 All Rights Reserved.
*/
package boot.demo.invoke;
/**
* <pre>
*
* </pre>
*
* @author sxl
* @version $Id: User.java, v 0.1 2019年7月31日 下午1:22:37 sxl Exp $
*/
public class User {
// 用户id
public String userId;
// 用户姓名
public String userName;
// 外号
private static String nickName;
public String speak(String word) {
return word;
}
private static String speak2(String word, String word2) {
return word + word2;
}
/**
* @param userId
* @param userName
*/
public User(String userId, String userName) {
super();
this.userId = userId;
this.userName = userName;
}
/**
* @param userName
*/
private User(String userName) {
super();
this.userName = userName;
}
/**
* @param userName
*/
public User() {
super();
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public static String getNickName() {
return nickName;
}
public static void setNickName(String nickName) {
User.nickName = nickName;
}
/**
* @return
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "User [userId=" + userId + ", userName=" + userName + ", nickName=" + nickName + "]";
}
}