资讯专栏INFORMATION COLUMN

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

DevYK / 3035人阅读

摘要:大家好,乐字节小乐继续为初学者讲述基础知识。上次说到乐字节反射之三方法数组类加载器,这次是反射之四反射相关操作操作属性获取对象获取对象设置属性打开权限获取此属性调用方法调用方法,都是直接对象方法实参反射之后,动态调用方法需要使用即可。

大家好,乐字节小乐继续为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().getResourceAsStream("car.properties"));
  //获取对应的 完整路径(报名.类名)
  String clz =pro.getProperty("qq");
  CarFactory.product(clz).run();
 }

Java反射相关知识就讲到这里了,下次我们进入到JavaSE的课程:循环控制

请继续关注乐字节,Java知识技术分享,乐字节原创

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75278.html

相关文章

  • 字节Java反射之一:反射概念与获取反射源头class

    摘要:一反射机制概念程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言,如,是动态语言显然,,不是动态语言,但是有着一个非常突出的动态相关机制。相关的为二获取源头重点打开权限所有类的对象其实都是的实例。 一、Java反射机制概念 程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言,如Python, Ruby是动态语言;显然C++,Java,C#不是动态语言,但是JAVA有...

    caikeal 评论0 收藏0
  • 字节Java反射之二:实例化对象、接口与父类、修饰符和属性

    摘要:大家好,小乐继续接着上集乐字节反射之一反射概念与获取反射源头这次是之二实例化对象接口与父类修饰符和属性一实例化对象之前我们讲解过创建对象的方式有克隆反序列化,再加一种,根据对象,使用或者构造器实例化对象。 大家好,小乐继续接着上集:乐字节Java反射之一:反射概念与获取反射源头Class 这次是之二:实例化对象、接口与父类、修饰符和属性 一:实例化对象 之前我们讲解过创建对象的方式,有...

    xietao3 评论0 收藏0
  • 字节Java反射之三:方法、数组、类加载器和类的生命周期

    摘要:本文承接上一篇乐字节发射之二实例化对象接口与父类修饰符和属性继续讲述反射之三方法数组类加载器一方法获取所有方法包括父类或接口,使用即可。当没有任何引用指向对象时就会被卸载,结束类的生命周期。 本文承接上一篇:乐字节Java发射之二:实例化对象、接口与父类、修饰符和属性 继续讲述Java反射之三:方法、数组、类加载器 一、方法 获取所有方法(包括父类或接口),使用Method即可。sho...

    ChanceWong 评论0 收藏0
  • Java注解-注解处理器、servlet3.0|字节

    摘要:扩展了反射机制的,以帮助程序员快速的构造自定义注解处理器。返回该程序元素上存在的所有注解。在中,可以使用注解将一个继承于的类标注为可以处理用户请求的。 大家好,我是乐字节的小乐,上次给大家带来了Java注解-元数据、注解分类、内置注解和自定义注解|乐字节,这次接着往下讲注解处理器和servlet3.0showImg(https://segmentfault.com/img/bVbvBP...

    wangshijun 评论0 收藏0
  • 字节Java循环:循环控制和嵌套循环

    摘要:乐字节小乐上次讲完了反射,接下来小乐给大家讲述循环。循环有以下四部分一循环控制直到型先执行后判断,结构为先执行循环体,后判断布尔表达式。 乐字节小乐上次讲完了Java反射,接下来小乐给大家讲述Java循环。 循环有以下四部分:showImg(https://segmentfault.com/img/bVbu0OJ?w=755&h=286); 一、循环控制 1、do..while 直到型...

    Euphoria 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<