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()+" "+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(); } } }