java中的反射简单实例

时间:2021-08-04 21:47:07
package club.reflection.entity.User;
/**
* 实体类
*
*/
public class User {
public String name;
private Integer age;
private String sex; public User(){ }
public User(String name,Integer age,String sex){
this.name = name;
this.age = age;
this.sex = sex;
} public void eat(){
System.out.println("喜欢吃!!!!");
}
public void show(){
System.out.println("name:"+name);
System.out.println("tage:"+age);
System.out.println("sex:"+sex);
}
public void show(String xxx){
System.out.println("name:"+name);
System.out.println("tage:"+age);
System.out.println("sex:"+sex);
System.out.println(xxx);
}
}
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier; import club.reflection.entity.User.User; /**
* 反射实例 通过反射获取实体类中的属性方法
* @author Mr储
*
*/
public class RefDemo { public static void main(String[] args) {
try {
//获得Class对象()方法一通过Class静态方法forNmae();
Class cls1 = Class.forName("club.reflection.entity.User.User");
//通过class属性
Class cls2 = User.class;
//对象中通过Object类的getClass();
Class cls3 = (new User()).getClass();
System.out.println(String.class);
//通过Class的newInstance()获得对象的实例返回Object类型
Object obj = cls3.newInstance();
//强制转换为User类型
User user = (User)obj;
// System.out.println(cls3.getName());//club.reflection.instance.User获得类的完整名字
// System.out.println(cls3.getConstructors());//获得构造方法 for(Field f : cls1.getDeclaredFields()){
System.out.println(f);
}
System.out.println("++++++++++");
for(Field f : cls1.getFields()){
System.out.println(f);
}
/*//初始化一个User对象
User u1 = new User("张三",18,"男"); //获取属性
u1.show();
showField(u1);
u1.show();//属性赋值后的比较 //获取方法
showMethods(u1);*/
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
/**
* 获得类的属性
*/
public static void showField(Object obj){
try {
//将obj转化为Class对象
Class cls = obj.getClass();
Field[] fields = cls.getDeclaredFields();//获得所有的属性
for(Field field : fields){
System.out.println(field.getName()+"\t"+field.getType().getName());//获取属性名和类型
//改变访问权限(使可以赋值)
field.setAccessible(true);
//给类中的属性赋值
if(field.getType().getName().equals("java.lang.String")){
field.set(obj, "名字");
}else if(field.getType().getName().equals("java.lang.Integer")){
field.set(obj, 222);
} }
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
/**
* 获取方法
*/
public static void showMethods(Object obj){
Class cls = obj.getClass();
Method[] methods = cls.getDeclaredMethods();//获取所有方法
for(Method m : methods){
System.out.println("方法:"+m);
System.out.println("方法名称:"+m.getName());
System.out.println("访问修饰符:"+Modifier.toString(m.getModifiers()));
System.out.println("返回值类型:"+m.getReturnType()); //获得参类型
Class[] ClassParameters = m.getParameterTypes();
for(Class c : ClassParameters){
System.out.println("参数类型:"+c.getName());
}
} try {
//获得对象的方法
Method show1 = cls.getMethod("show");
//执行方法
show1.invoke(obj); //获得对象的方法
/**
* "show"要执行的方法名
* String.calss 方法参数的参数类型
*/
Method show2 = cls.getMethod("show",String.class);
//执行方法
show2.invoke(obj, "反射调用传参");
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}