-------反射--------
1,java反射(Reflection)的底层实现原理
众所周知Java有个Object 类,是所有Java 类的
继承根源,其内声明了数个应该在所有Java类中
被改写的方法:hashCode()、equals()、clone()、
toString()、getClass()等。其中getClass()返回一个
Class 对象
而这个Class 类十分特殊。它和一般类一样继承自
Object,当一个class被加载,或当加载器(class
loader)的defineClass()被JVM调用,JVM 便自动产生
一个Class 对象。
2,Class类其中的yibufen方法,
- 获取公共构造器 getConstructors()
- 获取所有构造器 getDeclaredConstructors
- 获取包含的方法 getMethod()
- 获取包含的属性 getField(String name)
- 获取内部类 getDeclaredClasses()
- 获取外部类 getDeclaringClass()
- 获取所实现的接口 getInterfaces()
- 获取修饰符 getModifiers()
- 获取所在包 getPackage()
- 获取类名包含包路径 getName()
- 类名不包含包路径 getSimpleName()
3,怎么使用反射?
一般情况下我们通过反射创建类对象主要有两种方式:
通过 Class 对象的 newInstance() 方法
通过 Constructor 对象的 newInstance() 方法
4,,java反射的简单演示
上面介绍了下java反射的实现机制,接下来我主要来演示一下反射的使用
首先定义一个user对象类如下:
/**
* 定义一个用户对象
*
* @author zhangqh
* @date 2018年4月24日
*/
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* 用户id
*/
private Integer userId;
/**
* 用户名称
*/
private String userName;
/**
* 公共元素
*/
public String age;
private User(Integer userId){}
public User(){}
public User(Integer userId, String userName) {
super();
this.userId = userId;
this.userName = userName;
}
/**
* @return the userId
*/
public Integer getUserId() {
return userId;
}
/**
* @param userId the userId to set
*/
public void setUserId(Integer userId) {
this.userId = userId;
}
/**
* @return the userName
*/
public String getUserName() {
return userName;
}
/**
* @param userName the userName to set
*/
public void setUserName(String userName) {
this.userName = userName;
}
}
5.获取类成员变量信息
方法 | 用途 |
---|---|
getField(String name) | 获取某个公有的属性对象 |
getFields() | 获取所有公有对象 |
getDlecaredField(String name) | 获取某个属性对象(public和非public) |
getDlecaredFields() | 获取所有属性对象(public和非public) |
6.获取构造函数
方法 | 用途 |
---|---|
getConstrutor(Class…<?>parameterTypes) | 获得该类中与参数类型匹配的公有构造方法 |
getConstrutors() | 获取该类中所有公有构造方法 |
getDeclaredConstrutor(class…<?>parameterTypes) | 获得该类中与参数列表匹配的构造方法 |
getDeclaredConstrutors | 获得该类中所有构造方法 |
7.反射是什么?
反射是什么呢?当我们的程序在运行时,需要动态的加载一些类这些类可能之前用不到所以不用加载到jvm,而是在运行时根据需要才加载。 原来使用new的时候,需要明确的指定类名,这个时候属于硬编码实现,而在使用反射的时候,可以只传入类名参数,就可以生成对象,降低了耦合性,使得程序更具灵活性。