java_212_反射机制_动态操作_构造器_方法_属性_练习2

package java_212_反射机制_动态操作_构造器_方法_属性_练习;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**

  • 通过反射API动态的操作:构造器,方法 属性等的调用

*/
@SuppressWarnings(“all”)
public class Demo03 {
public static void main(String[] args) {
//实现动态加载
String path = “java_212_反射机制_动态操作_构造器_方法_属性_练习.User”;//路径 ;包+类名
//创建动态对象
try {
//通过反射API调用构造方法,构造对象;newInstance新 实例
Class clazz = Class.forName(path);
User u1 = (User)clazz.newInstance();//强制转型;其实是调用了User的无参构造方法
System.out.println(u1);//注意 如果出现报错 提示类型转换错误;有可能是String path路径没有写对
/Class clazz = (Class) Class.forName(path);//转型也可以在这里做 下面就不用转型
User u2 = clazz.newInstance();//其实是调用了User的无参构造方法
System.out.println(u2);
/

		  //指定构造器
		  Constructor<User> c = clazz.getDeclaredConstructor(int.class,int.class,String.class);
		  User us = c.newInstance(1001,20,"张三");//需要添加具体数据即传递实参
		  System.out.println(us.getId()+":"+us.getAge()+":"+us.getUname());
		  System.out.println("====通过反射API调用普通方法====");
		  //通过反射API调用普通方法
		  User u3 = (User) clazz.newInstance();
		  //u3.setUname("李四");//这是直接调
		  //通过反射调  ;好处是 方法名和参数都是变量;方便以后动态使用
		  Method method = clazz.getDeclaredMethod("setUname", String.class);
		  //调用;
		  method.invoke(u3, "李四");//invoke调用;
		  System.out.println(u3.getUname());
		  System.out.println("====通过反射API操作属性====");
		  //通过反射API操作属性
		  User u4 = (User) clazz.newInstance();
		  Field f = clazz.getDeclaredField("uname");//获取对应的属性uname
		  //如果不通过反射就会报错;解决方法
		  f.setAccessible(true);//setAccessible设置访问;这个属性不需要做安全检查了,可以直接访问
		  f.set(u4, "王五");//如果不通过反射运行后这里报错 因为private String uname是内部使用的
		  System.out.println(u4.getUname());//直接调用
		  //另一个方法获取
		  System.out.println(f.get(u4));//通过反射调用
		   
	} catch (Exception e) {  
		 e.printStackTrace();  
	}
}

}
//------------------属性-----------------------------------
package java_212_反射机制_动态操作_构造器_方法_属性_练习;
/**

  • 属性
    */
    public class User {
    private int id;
    private int age;
    private String uname;
    //get与set方法
    public int getId() {
    return id;
    }
    public void setId(int id) {
    this.id = id;
    }
    public int getAge() {
    return age;
    }
    public void setAge(int age) {
    this.age = age;
    }
    public String getUname() {
    return uname;
    }
    public void setUname(String uname) {
    this.uname = uname;
    }
    //构造器
    public User() {

    }
    public User(int id, int age, String uname) {
    super();
    this.id = id;
    this.age = age;
    this.uname = uname;
    }
    }

//结果-----------------------------------------
java_212_反射机制_动态操作_构造器_方法_属性_练习.User@1db9742
1001:20:张三
通过反射API调用普通方法
李四
通过反射API操作属性
王五
王五

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值