zoukankan      html  css  js  c++  java
  • Java反射学习总结

    广州疯狂软件教育Java培训,iOS培训分享
    Class类是Reflection API中核心的类,他位于java.lang.Class
    列出一些常用的方法。
    - getName() : 获得类的完整名字
    - getFields() : 获得类的public类型的属性
    - getDeclaredFields() : 获得类的所有属性
    - getMethods() : 获得类的public类型的方法
    - getDeclaredMethods() : 获得类的所有方法
    - getMethod(String name, Class[] parameterTypes) : 获取类的特定方法(name参数指定方法名字,parameterTypes参数指定方法参数类型)
    - getConstructors() : 获得类的public类型的构造方法
    - getConstructor(Class[] parameterTypes) : 获得类的特定构造方法(parameterTypes参数指定构造方法的参数类型)
    - newInstance() : 通过类的不带参数的构造方法创建这个类的一个对象
    如果想使用反射,有2个关键的部分
    1.获取Class对象
    2.获得对象实例
    下面来介绍这两个部分:
    1.如何获取Class对象
    获取某个类或某个对象所对应的Class对象的常用的3种方法
    a) 使用Class类的静态方法forName:
    Class.forName("java.lang.String");
    b) 使用类的.class语法:
    String.class;
    c) 使用对象的getClass()方法(java.lang.Object类中的方法):
    String s = "aa";
    Class<?> clazz = s.getClass();
    2.如何获得对象实例
    大家都知道获得对象实例就是去new一个,其实就是调用对象的构造方法
    这里将调用构造方法参数的不同分为两种类型:
    a)调用无参数的构造方法:
    1.调用Class对象的newInstance()方法:
    Class<?> classType=ClassClass.forName("java.lang.String");
    Object object = classTpye.newInstance();
    2.调用Class对象的Constructor对象的newInstance()方法,传递一个空的Class对象数组作为参数:
    Class<?> classType=ClassClass.forName("java.lang.String");
    Constructor cons = classType.getConstructor(new Class[]{});
    Object object =cons.newInstance(new Object[]{});
    b)调用有参数的构造方法:
    1.调用Class对象的Constructor对象的newInstance()方法,传递一个可变长的Class对象数组作为参数,本例传递String,int两个参数:
    Class<?> classType=ClassClass.forName("java.lang.String");
    Constructor cons = classType.getConstructor(new Class[]{String.class, int.class});
    Object object = cons.newInstance(new Object[]{"hello",3});
    下面来一个小Demo,由于过于简单这里就只贴代码了
    这个demo简单的实现了上面介绍的一些关于反射的用法,算是一个复习巩固:
    class Person {

     private long id;
     private int age;
     private String name;
     
     public Person() {
      
     }
     
     public Person(String name, int age) {
      this.name = name;
      this.age = age;
     }
     
     @Override
     public String toString() {
      
      return "Name="+getName()+"  Age="+getAge()+"  Id="+getId();
     }
     
     public long getId() {
      return id;
     }

     public void setId(long id) {
      this.id = id;
     }

     public int getAge() {
      return age;
     }

     public void setAge(int age) {
      this.age = age;
     }

     public String getName() {
      return name;
     }

     public void setName(String name) {
      this.name = name;
     }

    }
    很简单的一个自定义类,两个构造方法,和一些get,set方法,还有一个重写的toString
    下面是调用反射的main方法中的代码,主要就是用反射的方法调用Person的带参构造方法给age,name赋值,在调用setId给id赋值,最后调用toString方法打印出结果
    public static void main(String[] args) throws Exception {
      //获取Person类的Class对象
      Class<?> classType = Class.forName("Person");
      //调用Person类的两个参数构造方法生成对象
      Constructor constructor = classType.getConstructor(new Class[]

    {String.class, int.class});
      Object object = constructor.newInstance(new Object[]{"Dean",25});
      //获取setId方法
      Method setId = classType.getMethod("setId", new Class[]{long.class});
      //调用setId方法设置Id
      setId.invoke(object, new Object[]{10})
      //调用toString输出结果
      Method toString = classType.getMethod("toString", new Class[]{});
      String result = (String) toString.invoke(object, new Object[]{});
      System.out.println(result);
    }

    输出结果为:Name=Dean Age=25 Id=10
    疯狂Java培训专注软件开发培训,提升学员就业能力,重点提升实践动手能力。高薪从IT名企请来项目经理为学员亲自授课,对学员进行实战教学,在没有工作经验的学员,在疯狂java,通过大量全真经典企业级项目进行集中培训,学员通过数月培训都可获得1-2年的工作经验,进而在同类的求职者中脱颖而出。疯狂Java培训让你体会java编程的快乐,项目开发的兴奋,成就感,通过短短几个月的时间,让你在半年的时间内掌握8-10万的代码量,掌握Java核心技术,迅速成为技能型的现代化高端人才,迅速获得高薪就业!

  • 相关阅读:
    fedora中将程序的快捷方式添加到“应用程序”中的方法
    Windows PHP 中 VC6 X86 和 VC9 X86 的区别及 Non Thread Safe 的意思
    Fedora/Centos升级Python由2.7到3.2
    MVC模式小结
    使用MVVM模式的WPF应用(翻译文章)
    WPF的数据绑定
    关于cookie、session、application知识 的整理
    C#中关于Module和Assembly的关系
    c#接口和抽象类的一些概念
    23种设计模式(超级简洁)
  • 原文地址:https://www.cnblogs.com/gojava/p/3709733.html
Copyright © 2011-2022 走看看