反射


POJO(User)

public class User {

	private String name;
	private String age;
	private String height;
	private String id;
	private String address;
	public User(){
		super();
	}
	public User(String name,int age,int height,String id,String address){
		this.name=name;
		this.age=Integer.toString(age)+"岁";
		this.height=Integer.toString(height)+"kg";
		this.id=id;
		this.address=address;	
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
		System.out.println("xmwokdwioedj");
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public String getHeight() {
		return height;
	}
	public void setHeight(String height) {
		this.height = height;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + ", height=" + height
				+ ", id=" + id + ", address=" + address + "]";
	}
	
	private void eat(String name){
		this.name=name;
		System.out.println(name+"在吃萝卜");
	}
	private void run(){
		System.out.println("user会跑 不是loser");
	}
}


方法详情
Class.forName(“包名 . 类名”)获取“类对象”
类名 . class获取“类对象”
导管获取“类对象”
getFields()(私有,继承&公有]                变量
getDeclaredFields()[私有&公有,继承)               变量
getConstructors(int.class, String.class……)获得public构造方法
getDeclaredConstructors(int.class, String.class……)获得private构造方法
getMethods()(私有,继承&公有]                方法
getDeclaredMethods()[私有&公有,继承)                方法



反射有参构造方法(创造一个有参的对象):

		Class<?> clazz= User.class;	//获取有参构造方法时一定要传上这个有参构造的所有参数类型
		Constructor<?> con= clazz.getConstructor(String.class,int.class,int.class,String.class,String.class);
		//获取User类的一个有5个参数的构造方法
		Object obj= con.newInstance("饭先生",20,63,"001","南昌");	
		反射类的新建实例并设置有参构造的参数值
		System.out.println(obj);		

执行结果:
在这里插入图片描述




反射设置一个对象的单个属性:


		Class<?> clazz=User.class;
		User user=new User();
		Field field= clazz.getDeclaredField("name");//获取这个对象name的属性
		field.setAccessible(true);//设置这个name属性为可见性
		field.set(user, "小强");//设置user的name属性值为小强
		System.out.println(user.getName());//通过user类内部的getName()方法获取设置的name值
		

执行结果:
在这里插入图片描述




反射获取一个类的方法 getDeclaredMethod [私有,继承)


		Class<?> clazz= User.class;//获取User这个类对象
		Method eat=clazz.getDeclaredMethod("eat",String.class);//获取User中有参方法eat(String name)  	获取有参方法时要写返回的参数类型
		eat.setAccessible(true);//私有属性获取时要开启可见权限						
		eat.invoke(new User(), "我小凡");//反射取出eat方法并设置eat参数的值
		
		Method run=clazz.getDeclaredMethod("run");//获取User中无参方法run()	获取无参方法时不用考虑
		run.setAccessible(true);//私有属性获取时要开启可见权限	
		run.invoke(new User());//反射取出run方法
		

执行结果:
在这里插入图片描述


获取到一个类里所有的构造方法、方法、属性

		Class<?> clazz=User.class;
		int modifiers = clazz.getModifiers();//获取user类的public or private
		String mo = Modifier.toString(modifiers);
		System.out.println(mo+" "+clazz.getSimpleName());//User.class.getSimpleName()是获取User类的类名
		
		Constructor<?>[] cond = clazz.getDeclaredConstructors();
		for(int i=0;i<cond.length;i++){
			Class<?>[] parameterTypes = cond[i].getParameterTypes();
			System.out.print(Modifier.toString(cond[i].getModifiers())+" "+clazz.getSimpleName()+"(");
			for(int j=0;j<parameterTypes.length;j++){
				System.out.print(parameterTypes[j].getSimpleName()+" args"+j+",");
			}
			System.out.println("){}");
		}
		
		Method[] dm = clazz.getDeclaredMethods();
		System.out.print("方法:");
		for(int i=0;i<dm.length;i++){
			dm[i].setAccessible(true);
			System.out.print((i+1)+"."+dm[i].getName()+"方法   ");
			
		}
		
		System.out.println();
		
		Field[] df = clazz.getDeclaredFields();
		System.out.print("属性:");
		for(int i=0;i<df.length;i++){
			df[i].setAccessible(true);
			System.out.print((i+1)+"."+df[i].getType().getSimpleName()+" "+df[i].getName()+" ");
		}

在这里插入图片描述


整形List集合添加String类型的元素

泛型在运行期会被擦掉 ,即可通过反射来添加其他类型的元素

		List<Integer> list=new ArrayList<Integer>();
		list.add(1);
		list.add(2);
		list.add(3);
//		list.add("小范");	通过反射在类型为Integer的list添加一个string类型的元素
		Class<? extends List> clazz = list.getClass();
		Method method = clazz.getMethod("add", Object.class);//反射获取list的add方法   add是有参方法,万物皆对象,直接填Object的类型
		method.invoke(list, "小范");//这样就添加了
		System.out.println(list);						//泛型只在编译期起作用

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Brrby

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值