反射

反射是什么?

从.java->.class 编译

.class->.java 反编译(反射)编译一个javabean 反射的形式来实例化对象

利用反射来获取类的对象:

                     // 1 根据类名获取类的对象
		Class<Person> p = Person.class;
		// 2 根据对象来获取类的对象(获取class)
		Person person = new Person();
		System.out.println(person.getClass());
		// 3 得到类的对象 com.entity.Person全限定名(全路径限定名)
		Class c1 = Class.forName("com.entity.Person");
		System.out.println(c1);
		// 4
		Class c2 = Person.class.getClassLoader().loadClass("com.entity.Person");
		System.out.println(c2);
		// 5 得到父类
		Class c3 = Person.class.getSuperclass();
		System.out.println(c3);
		// 6 包装类
		Class c4 = Integer.class;
		System.out.println(c4);

根据类得到类名(全限定名):

                // 得到你的类的对象
		Class c = Class.forName("com.entity.Person");
		// 输出类名
		System.out.println(c.getName());
		// 输出包
		System.out.println(c.getSimpleName());

Field类(属性):

                // 属性
		// Field f1 = c.getField("pid"); 获取公共属性
		// 获取属性(可以获取私有属性)
		Field f1 = c.getDeclaredField("pid");
		// 设置私有的属性能够被访问
		f1.setAccessible(true);
		// 得到名称
		System.out.println(f1.getName());
		// 得到访问修饰符
		System.out.println(f1.getModifiers());
		// 得到属性的数据类型
		System.out.println(f1.getType());
		// 得到一个person对象 newInstance 产生一个新的实例 实例化对象
		Object person1 = c.newInstance();
		// 赋值
		f1.set(person1, "1");
		// 取值
		System.out.println(f1.get(person1));

		Field f2 = c.getDeclaredField("pname");
		// 设置私有的属性能够被访问
		f2.setAccessible(true);
		System.out.println(f2);
		Object person2 = c.newInstance();
		f2.set(person2, "张三");
		System.out.println(f2.get(person2));

		// 获取当前类对象中的所有的属性
		Field[] fields = c.getDeclaredFields();
		Object persons = null;
		for (Field f : fields) {
			f.setAccessible(true);
			persons = c.newInstance();
			if ("pid".contains(f.getName())) {
				f.set(persons, "1");
			} else if ("pname".contains(f.getName())) {
				f.set(persons, "张三");
			} else if ("psex".contains(f.getName())) {
				f.set(persons, "男");
			}
			System.out.println(f.get(person));
		}
Method类(方法):
// 无参无返回方法1
		Class classs = Class.forName("com.entity.Person");
		Method m1 = c1.getMethod("m1", null);
		Object obj = c1.newInstance();
		m1.invoke(obj, null);
		// 无参有返回方法2
		Method m2 = c1.getMethod("m2", null);
		System.out.println(m2.invoke(obj, null));
		// 有参无返回方法3
		Method m3 = c1.getMethod("m3", String.class, String.class, String.class);
		m3.invoke(obj, "1", "张三", "男");
		// 有参有返回方法4
		Method m4 = c1.getMethod("m4", String.class, String.class, String.class);
		System.out.println(m4.invoke(obj, "1", "张三", "男"));
		// 得到方法的参数类型
		Class[] cl = m4.getParameterTypes();
		for (Class cp : cl) {
			System.out.println(cp.getSimpleName());
		}
		// 获取私有方法
		// Method m4 = cc.getDeclaredMethod("m4", String.class, String.class,
		// String.class);
		// m4.setAccessible(true);
		// System.out.println(m4.invoke(obj, "1", "张三", "男"));

构造方法:

                // 无参
		Class cc = Class.forName("com.entity.Person");
		Constructor cto = c2.getConstructor(null);
		System.out.println(cto);

		// 有参
		Constructor[] ctos = c2.getConstructors();
		for (Constructor con : ctos) {
			System.out.println(con);
		}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值