day07 Class_field_method_反射

Class
由于Class类没有公共构造方法,所有创建Class的对象的方法有以下几种:
 
1).通过Class.forName()静态方法返回Class类的一个实例
Class cls=Class.forName("model.Dog"); Class cls1=Class.forName("model.Person");
2).通过类名.class来获取一个class类的实例
cls =Dog.class;
3).代码运行在非静态区通过this.getClass()获取Class
Class cls= this.getClass();
 
Class对象既然是描述一个类,那么我们通过该Class的实例能够做什么事情呢?
类的属性
获取类名
System.out.println(cls.getName()); System.out.println(cls.getSimpleName());
获取类的修饰限定符
int modi = cls.getModifiers(); System.out.println(modi);
 
--获取一个类的属性
1.根据一个属性名获取一个public属性的描述
Field field = cls.getField("name");
2.获取一个类的全部public属性的描述
Field[] fields = cls.getFields(); System.out.println(fields.length);
 
3.根据一个属性名获取一个在类中声明的属性的描述
Field declaredField = cls.getDeclaredField("gender");
4.获取所有在类中声明的属性的描述
Field[] declaredFields = cls.getDeclaredFields(); System.out.println(declaredField);
 
--获取一个类的方法,通过四个方法获取method对象
1.根据一个方法的名字获取类中的一个public的方法的描述
Method method = cls.getMethod("run", String.class,int.class);
2.获取所有在类中是public的方法的描述
Method[] methods = cls.getMethods();
 
3.根据一个方法名获取在类中声明的一个方法的描述
Method declaredMethod = cls.getDeclaredMethod("eat", null);
4.获取所有在类中声明的方法的描述
Method[] declaredMethods = cls.getDeclaredMethods();
 
 
返回cls所代表的类的实例
Object obj = cls.newInstance(); System.out.println(obj);
 
可以传参
Constructor c = cls.getConstructor(String.class); c.newInstance("aaa");
 
 
 
field
 
获取所有属性
Field[] declaredField =cls.getDeclaredFields(); for (Field filed:declaredField) { System.out.println(filed.getName()); }
使用Filed类的一个实例,来描述cls类的实例中的"一个"属性
Field field =cls.getDeclaredField("gender");
获取属性的名字
System.out.println(field.getName());
获取属性的类型
Class strcls =field.getType(); System.out.println(strcls.getName());
获取属性的限定符
int modifiers =field.getModifiers(); System.out.println(modifiers);
 
创建Dog类的一个对象
Dog d = new Dog("旺财","母"); System.out.println(d.getGender());
暴力设置:设置field的访问
field.setAccessible(true);
 
有d对象,希望给d对象的gender属性赋值,可以使用set方法
field.set(d, "公"); System.out.println(d.name); System.out.println(field.get(d));
 
 
method
通过cls.getDeclaredMethod获取Method对象
Method m=cls.getDeclaredMethod("run",String.class,int .class); Method m=cls.getDeclaredMethod("eat",null);
 
 
获取方法名
System.out.println(m.getName());
 
方法的返回值类型
Class returntype = m.getReturnType(); System.out.println(returntype.getName());
 
方法的参数类型
Class[] paraType = m.getParameterTypes(); for (int i = 0; i < paraType.length; i++) { System.out.println(paraType[i].getName()); }
获取方法的修饰符
int modifiers = m.getModifiers(); System.out.println(modifiers); Dog d = new Dog("旺财", "母");
 
 
方法是可以执行的,使用invoke执行method对象所表示的方法
m.invoke(d, "aaa",123);
m为静态
m.invoke(null,null);
 
 
 
 
/使用反射相关类,为对象p设置name属性的值
Person p=new Person();
 //使用反射相关类,为对象p设置name属性的值 
Class cls=p.getClass(); 
Field[] fs=cls.getDeclaredFields(); 
for (int i = 0; i < fs.length; i++) { 
Field f = fs[i]; 
if(f.getName().equals("name")) {
 String setName = "set"+f.getName().substring(0, 1).toUpperCase()+ f.getName().substring(1);
 //设置器的形参和属性的类型应当一致
 Method m = cls.getDeclaredMethod(setName, f.getType());
 //相当于p方法调用了setName方法
 m.invoke(p, "张山"); 
}
 } 
System.out.println(p.getName());
 
 
原文地址:https://www.cnblogs.com/aknife/p/10758783.html