语法
// 加载类到内存中
Class<?> clazz = Class.forName("com.duoduo.User");
加载类完成之后,在堆内存中,就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象包含了类的所有信息,我们可以通过这个对象看到类的所有结构。
反射:这个对象就像一面镜子,透过这个镜子可以看到类的结构。
实体类
package com.duoduo;
import com.annotation.Column;
import com.annotation.Table;
/**
* @author Duoduo
* @version 1.0
* @date 2017/5/13 10:33
*/
@Table(name = "User")
public class User {
@Column(name = "userName")
private String userName;
private String password;
public int age;
public User() {
}
public User(String userName) {
this.userName = userName;
}
public User(String userName, String password, int age) {
this.userName = userName;
this.password = password;
this.age = age;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
}
反射测试类
package com.duoduo.reflection;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @author Duoduo
* @version 1.0
* @date 2017/5/14 22:53
*/
public class Demo1 {
public static void main(String[] args){
try {
// 加载类到内存中
Class<?> clazz = Class.forName("com.duoduo.User");
//获取报名+类名
System.out.println(clazz.getName());
//获取类名
System.out.println(clazz.getSimpleName());
//获取public属性
Field[] publicFileds = clazz.getFields();
System.out.println(publicFileds.length);
for (Field field: publicFileds){
System.out.println(field.getName());
}
System.out.println("********* 获取所有的属性字段 **************");
Field[] fields = clazz.getDeclaredFields();
for (Field field:fields){
System.out.println("----------------------------");
System.out.println("属性 : "+field);
Annotation[] annotations = field.getAnnotations();
for ( Annotation annotation:annotations){
System.out.println("注解 : "+ annotation.toString());
}
}
System.out.println("********* 获取所有的方法 **************");
Method[] methods = clazz.getDeclaredMethods();
for (Method method: methods){
System.out.println(method);
}
//如果方法有参数,则必须传递参数对应的class对象
Method setMethod = clazz.getDeclaredMethod("setPassword", String.class);
System.out.println(setMethod);
System.out.println("********* 获取所有的构造器 **************");
Constructor[] constructors = clazz.getDeclaredConstructors();
for (Constructor constructor:constructors){
System.out.println(constructor);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
测试结果
********* 获取报名+类名 **************
com.duoduo.User
类名 : User
********* 获取public属性 **************
age
********* 获取所有的属性字段 **************
----------------------------
属性 : private java.lang.String com.duoduo.User.userName
注解 : @com.annotation.Column(name=userName)
----------------------------
属性 : private java.lang.String com.duoduo.User.password
----------------------------
属性 : public int com.duoduo.User.age
********* 获取所有的方法 **************
public java.lang.String com.duoduo.User.toString()
public void com.duoduo.User.setAge(int)
public void com.duoduo.User.setUserName(java.lang.String)
public int com.duoduo.User.getAge()
public void com.duoduo.User.setPassword(java.lang.String)
public java.lang.String com.duoduo.User.getUserName()
public java.lang.String com.duoduo.User.getPassword()
public void com.duoduo.User.setPassword(java.lang.String)
********* 获取所有的构造器 **************
public com.duoduo.User(java.lang.String,java.lang.String,int)
public com.duoduo.User(java.lang.String)
public com.duoduo.User()
Process finished with exit code 0