反射

1、什么是反射
1.1:反射java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法
1.2:反射是一种基石(基础)

  1. 一切反射相关的代码都从获得类对象开始
    2.1 Class.forName(完整类名)
    2.2 类名.class
    2.3 对象.getClass()

  2. 一切反射相关的代码都从获得类对象开始
    3.1 Class.forName(完整类名)
    3.2 类名.class
    3.3 对象.getClass()

  3. 反射三大作用(java.lang.reflect.*)
    4.1 实例化对象
    1、无参公有的实例化

	Student stu=new Student();
	Class<? extends Student> clz=stu.getClass();
	Student stu2 =(Student) clz.newInstance();

2、有一个参数公有的构造器实例化

		Constructor<? extends Student> c = clz.getConstructor(String.class);
		Student stu3 = c.newInstance("s001");

3、有两个参数的公有的构造器实例化

		Constructor<? extends Student> c2 = clz.getConstructor(String.class,String.class);
		Student stu4 = c2.newInstance("s001","张三");

4、私有的构造器实例化

		Constructor<? extends Student> c3 = clz.getDeclaredConstructor(Integer.class);
		c3.setAccessible(true);
		Student stu6=c3.newInstance(22);

4.2 动态调用方法
1、无参公有的方法调用

Student stu=new Student();
Class<? extends Student> clz=stu.getClass();
Method m = clz.getMethod("hello");
Object invoke = m.invoke(stu);
//动态被调用的方法,如果该方法是void类型的返回值,那么被invoke,此时结果为null
System.out.println(invoke);

2、有一个参数方法调用

Method m2 = clz.getMethod("hello", String.class);
Object invoke2 = m2.invoke(stu, "zhangsan");
System.out.println(invoke2);

3、私有的方法调用

Method m3 = clz.getDeclaredMethod("add", Integer.class,Integer.class);
m3.setAccessible(true);
Object invoke3 = m3.invoke(stu, 20,5);
System.out.println(invoke3);

4.3读写属性
公有的、私有的读写属性

package com.liubiao.reflect;

import java.lang.reflect.Field;

/**
 * 	反射读写属性
 * 		公有的、私有的读写属性
 * @author liubiao
 *
 * http://javalb.com
 */
public class Demo4 {
	public static void main(String[] args) throws Exception {
		
		Student stu=new Student("s001","zhangsan");
		stu.age=22;
		Class<? extends Student> clz = stu.getClass();
		System.out.println(stu.getSname());
		
		System.out.println("---------------------------");
		Field f = clz.getDeclaredField("sname");
		f.setAccessible(true);
		System.out.println(f.get(stu));
		
		//反射读写属性常用方法(一次性获取该类的所有属性值)
		System.out.println("----------------------------");
		Field[] fs = clz.getDeclaredFields();
		for (Field ff : fs) {
			ff.setAccessible(true);
			System.out.println(ff.get(stu));
		}
		
		System.out.println("-------------设置---------------");
		//想通过反射改变sname对应的值
		f.set(stu, "list");
		System.out.println(stu.getSname());
		
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值