您的位置:首页 > 其它

反射(一) Reflection - 获取类的属性&方法

2017-05-15 00:15 405 查看

语法

// 加载类到内存中
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐