反射测试类:
package com.wyp.reflection;
import java.lang.reflect.Field;
/**
* @FileName:Student.java
* @Author:Wyp
* @Time:2016-9-13
* 反射测试类
*/
public class Student {
//私有变量在使用反射访问时,默认的可访问性是false,就是访问不到的意思
private String name;
private int age;
private String nickName;
public Student(){}
public Student(String name,int age,String nickName){
this.name = name ;
this.age = age;
this.nickName = nickName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
//返回基本信息
public String getInfos(){
return this.name+","+this.age+","+this.nickName;
}
//使用反射重写toString方法
public String toString(){
StringBuffer sb = new StringBuffer();
Field[] fields = this.getClass().getFields();
for(Field f:fields){
sb.append(f.getName());
sb.append(" = ");
try{
sb.append(f.get(this));
sb.append("\n");
}catch(Exception e){
e.printStackTrace();
}
}
return sb.toString();
}
}
反射效果测试:
package com.wyp.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @FileName:testDemo1.java
* @Author:Wyp
* @Time:2016-9-13
*/
public class testDemo1 {
public static void main(String[] args) {
try {
//三种获取class对象的途径
Class<?> clazz = Class.forName("com.wyp.reflection.Student");
Class<Student> clazz1 = Student.class;
//
Student stu = new Student("张三",21,"程序员");
Class<Student> clazz2 = (Class<Student>) stu.getClass();
//对应成员属性的获取
Field[] fields = clazz.getDeclaredFields();
System.out.println("反射调用成员属性:");
for(Field f:fields){
f.setAccessible(true); //私有成员可访问性设置为true
System.out.println(f.get(stu));//打印所有成员属性
}
Object o = new Object();
//获取所有方法
Method[] ms = clazz.getDeclaredMethods();
System.out.println("反射调用方法:");
for(Method mm:ms){
if(mm.getName().indexOf("get")>=0){
mm = clazz.getDeclaredMethod(mm.getName(), null); //获取指定方法名的Method对象
System.out.println("方法名:"+mm.getName()+" 结果:"+mm.invoke(stu)); //调用stu对象的指定方法
}
}
//反射创建对象
//无参构造函数
Student obj = clazz1.newInstance();
System.out.println("无参构造函数创建对象:"+obj.getInfos());
//有参构造函数
//方法一,在使用newInstance()以后,在使用setter方法添加参数
obj.setName("塔斯");
obj.setAge(18);
obj.setNickName("Case");
System.out.println("有参构造函数创建对象:"+obj.getInfos());
//方法二,直接使用Constructor类创建有参
Constructor<Student> con = clazz1.getConstructor(String.class,int.class,String.class);
obj = con.newInstance("里斯",32,"NIKE");
System.out.println("有参构造函数创建对象:"+obj.getInfos());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}