黑马程序员----反射

论坛 期权论坛 脚本     
匿名技术用户   2021-1-6 18:09   34   0


------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流!

1.Class

.class文件加载到内存中就是一个Class对象

获取Class对象的方式有3种:

Scanner sc = newScanner("xxx.txt");

Class.forName(sc.nextLine());

类名.class

对象.getClass()

[java] view plain copy
  1. import cn.itcast.bean.Person;
  2. public class Demo1_Reflect {
  3. /**
  4. * @param args
  5. * @throws ClassNotFoundException
  6. */
  7. public static void main(String[] args) throws ClassNotFoundException {
  8. Class<?> clazz1 = Class.forName("cn.itcast.bean.Person");
  9. Class<?> clazz2 = Person.class;
  10. Person p = new Person();
  11. Class<?> clazz3 = p.getClass();
  12. System.out.println(clazz1 == clazz2);
  13. System.out.println(clazz2 == clazz3);
  14. }
  15. }

2.Constructor

Class类的newInstance()方法是使用该类无参的构造函数创建对象, 如果一个类没有无参的构造函数, 就不能这样创建了

可以调用Class类的getConstructor(String.class,int.class)方法获取一个指定的构造函数

然后再调用Constructor类的newInstance("张三",20)方法创建对象

[java] view plain copy
  1. import java.lang.reflect.Constructor;
  2. import cn.itcast.bean.Person;
  3. public class Demo3_Constructor {
  4. /*
  5. @throws Exception
  6. */
  7. public static void main(String[] args) throws Exception {
  8. Class<?> clazz = Class.forName("cn.itcast.bean.Person");
  9. /*Person p = (Person) clazz.newInstance();
  10. System.out.println(p);*/
  11. Constructor con = clazz.getConstructor(String.class,int.class);//获取有参的构造函数
  12. Person p = (Person) con.newInstance("张三",23); //创建对象
  13. System.out.println(p); //打印对象
  14. }
  15. }

3.Field

Class.getField(String)方法可以获取类中的指定字段(可见的), 如果是私有的可以用getDeclaedField("name")方法获取

通过set(obj, "李四")方法可以设置指定对象上该字段的值, 如果是私有的需要先调用setAccessible(true)设置访问权限

用获取的指定的字段调用get(obj)可以获取指定对象中该字段的值

[java] view plain copy
  1. import java.lang.reflect.Constructor;
  2. import java.lang.reflect.Field;
  3. import cn.itcast.bean.Person;
  4. public class Demo4_Field {
  5. public static void main(String[] args) throws Exception {
  6. Class<?> clazz = Class.forName("cn.itcast.bean.Person");
  7. Constructor con = clazz.getConstructor(String.class,int.class);//获取有参的构造函数
  8. Person p = (Person) con.newInstance("张三",23); //创建对象
  9. /*Field f = clazz.getField("name");
  10. System.out.println(f);*/
  11. Field f = clazz.getDeclaredField("name"); //暴力反射
  12. f.setAccessible(true); //去除权限
  13. f.set(p, "李四");
  14. System.out.println(p);
  15. }

4.Method

Class.getMethod(String, Class...) 和 Class.getDeclaredMethod(String, Class...)方法可以获取类中的指定方法

调用invoke(Object,Object...)可以调用该方法

Class.getMethod("eat")invoke(obj) Class.getMethod("eat",int.class) invoke(obj,10)

[java] view plain copy
  1. import java.lang.reflect.Constructor;
  2. import java.lang.reflect.Method;
  3. import cn.itcast.bean.Person;
  4. public class Demo5_Method {
  5. /**
  6. *4.Method
  7. Class.getMethod(String, Class...) 和 Class.getDeclaredMethod(String, Class...)方法可以获取类中的指定方法
  8. 调用invoke(Object, Object...)可以调用该方法
  9. Class.getMethod("eat") invoke(obj) Class.getMethod("eat",int.class) invoke(obj,10)
  10. * @throws Exception
  11. */
  12. public static void main(String[] args) throws Exception {
  13. Class<?> clazz = Class.forName("cn.itcast.bean.Person");
  14. Constructor con = clazz.getConstructor(String.class,int.class);//获取有参的构造函数
  15. Person p = (Person) con.newInstance("张三",23); //创建对象
  16. Method m = clazz.getMethod("eat");
  17. m.invoke(p);
  18. Method m2 = clazz.getMethod("eat", int.class);
  19. m2.invoke(p, 10);
  20. }
  21. }

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP