什么是Java反射
就是正在运行,动态获取这个类的所有信息。
反射机制的作用
1,反编译:.class–>.java
2.通过反射机制访问java对象的属性,方法,构造方法等;
代码如下:
bean类
package com.luozhiyuan.reflection;
/**
* create by
*
* @Author luozhiyuan
* @qq 707530775@qq.com
* @on 2019-06-01.
* @time 16:49
*/
public class UserEntity {
private String userName;
public UserEntity() {
System.out.println("userEntity的无参构造方式创建对象");
}
private UserEntity(String userName) {
this.userName = userName;
System.out.println("通过有参构造方法创建userName为"+userName+"的对象。");
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
测试反射用法
package com.luozhiyuan.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* create by
*
* @Author luozhiyuan
* @qq 707530775@qq.com
* @on 2019-06-01.
* @time 16:51
*/
public class reflectionTest {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
// 1.通过new方式创建对象
UserEntity userEntityNew = new UserEntity();
// UserEntity userEntityNew2 = new UserEntity("zhangsan");
// 2.通过反射创建一个对象(无参构造函数)
// 使用Java的反射机制创建对象 类的完整路径
Class forName = Class.forName("com.luozhiyuan.reflection.UserEntity");
// 使用反射机制创建对象
UserEntity userEntityReflection = (UserEntity) forName.newInstance();
userEntityReflection.setUserName("通过反射创建对象。");
System.out.println(userEntityReflection.getUserName());
// 使用反射机制 获取类的方法信息
Method[] methods = forName.getMethods();
for(Method method : methods){
System.out.println("++++++++++++++++++");
System.out.println(method.getName());
}
// 获取类属性
Field[] fields = forName.getDeclaredFields();
for(Field field : fields){
System.out.println("*************************");
System.out.println(field.getName());
}
// 3.通过反射创建一个对象(有参构造函数)
Constructor<?> constructor = forName.getDeclaredConstructor(String.class);
// 如果bean类用private修饰,则应该修改访问权限
constructor.setAccessible(true);
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$");
UserEntity userEntity = (UserEntity) constructor.newInstance("lisi");
System.out.println(userEntity.getUserName());
}
}
总结:实例化类的方式可以通过反射实现,如果bean类用private修饰,则应该将访问权限设置为true。否则会报错。