day07 Class_field_method_反射

懵懂的女人 提交于 2020-11-02 21:55:18
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());

 

 
 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!