乐字节Java反射之四:反射相关操作

大家好,乐字节小乐继续为Java初学者讲述Java基础知识。上次说到乐字节Java反射之三:方法、数组、类加载器,这次是Java反射之四:反射相关操作

1、操作属性

                    //1、获取Class对象
			Class<?> clz=Class.forName("com.shsxt.ref.simple.User"); //2、获取对象  User u=(User)clz.newInstance(); //3、设置属性  Field field=clz.getDeclaredField("uname"); field.setAccessible(true);//打开权限  field.set(u, "0523"); //4、获取此属性  System.out.println(field.get(u));

 

2、调用方法

调用方法,都是直接对象.方法([实参]);反射之后,动态调用方法需要使用 invoke即可。

1)、方法调用

                //1、获取Class对象
		Class<?> clz=Class.forName("com.shsxt.ref.simple.User"); //2、获取对象  User u=(User)clz.newInstance(); //3、获取方法  Method m =clz.getMethod("coding", String.class,String.class); //4、成员方法的调用  m.invoke(u, "反射","多个参数"); //若是静态方法,传递null即可 因为静态方法属性类,不属于对象  m=clz.getMethod("testStatic",int.class); m.invoke(null, 100);//与对象无关

 

2)、操作setter与getter访问器

/**
     * @param obj     操作的对象
     * @param att      操作的属性
     * @param value  设置的值
 * */ public static void setter(Object obj, String att,Object value) { try { //setUname setUpwd -->第一个字母大写  att=att.substring(0,1).toUpperCase()+att.substring(1); Method method = obj.getClass().getMethod("set" + att, value.getClass()); method.invoke(obj, value); } catch (Exception e) { e.printStackTrace(); } } public static Object getter(Object obj, String att) { try { //getUname getUpwd -->第一个字母大写  att=att.substring(0,1).toUpperCase()+att.substring(1); Method method = obj.getClass().getMethod("get" + att); return method.invoke(obj); } catch (Exception e) { e.printStackTrace(); } return null; } main方法 //1、获取Class对象  Class<?> clz=Class.forName("com.shsxt.ref.simple.User"); //2、获取对象  User u=(User)clz.newInstance(); //3、设置值  setter(u,"uname","shsxt"); //获取值  String str=(String) getter(u,"uname"); System.out.println(str);

3、利用反射编写简单工厂设计模式

利用反射+配置文件可以实现简单工厂模式。

interface  Car{
 void run(); } class Bmw implements Car{ public void run(){ System.out.println("小样,学的怎么样"); } } class QQ implements Car{ public void run(){ System.out.println("大哥,救我"); } } class Benz implements Car{ public void run(){ System.out.println("哈哈"); } } //简单工厂 class CarFactory{ public static Car product2(String carStr){ if(carStr.equals("qq")){ return new QQ(); }else if(carStr.equals("benz")){ return new Benz(); } //如有其它车辆,需要添加代码  return null; } /**  * 根据字符串 创建对象  * @param carStr  * @return  */ public static Car product(String carStr){ try { return (Car)Class.forName(carStr).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } } #car.properties qq=com.shsxt.ref.simplefactory.QQ benz=com.shsxt.ref. simplefactory.Benz bmw=com.shsxt.ref. simplefactory.Bmw public static void main(String[] args) throws Exception { //加载配置文件  Properties pro =new Properties(); pro.load(Thread.currentThread().getContextClassLoader().

转载于:https://www.cnblogs.com/lotbyte/p/11165061.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值