美文网首页
Java反射机制

Java反射机制

作者: 南城的人 | 来源:发表于2017-04-14 11:00 被阅读0次

【案例1】通过一个对象获得完整的包名和类名

public class Demo {
    int age;
    String name;
  }  

public class Testit1 {
//    java反射详解:通过一个对象活的完整的包名和类名
public static void main(String[] args) {
    Demo demo = new Demo();
    System.out.println(demo.getClass().getName());
   }
}
 【运行结果】:Reflect.Demo
   添加一句:所有类的对象其实都是Class的实例。

【案例2】实例化Class类对象

  public class Demo {
        int age;
       String name;
   }

  public class Testit2 {
public static void main(String[] args) {
    Class<?> demo1 = null;
    Class<?> demo2 = null;
    Class<?> demo3 = null;

    try {
  //            一般经尽量采用这种形式
        demo1 = Class.forName("reflect12.Demo");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    demo2 = new Demo().getClass();
    demo3 = Demo.class;
    System.out.println("类名称1  "+demo1.getName());
    System.out.println("类名称2  "+demo2.getName());
    System.out.println("类名称3  "+demo3.getName());
     }
  }
  【运行结果】:
  类名称1  reflect12.Demo
  类名称2  reflect12.Demo
  类名称3  reflect12.Demo

【案例3】通过Class实例化其他类的对象通过无参构造实例化对象

  public class Person3 {
private String name;
private int age;

public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getAge() {
    return age;
}
public void setAge(int age) {
    this.age = age;
}
public void display() {
    String s = String.format("姓名=%s,年龄=%d", name, age);
    System.out.println(s);
}
@Override
public String toString() {
    return "[" + this.name + " " + this.age + "]";
}
  //    所以大家以后再编写使用Class实例化其
  他类的对象的时候,一定要自己定义无参的构
  造函数
  //    public Person3(String name, int age) {
 //        this.name = name;
  //        this.age = age;
  //    }
  }

  public class Testit3 {
public static void main(String[] args) {
    Class<?> demo = null;
    try {
        demo = Class.forName("reflect3.Person3");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    Person3 person3 = null;
    try {
        person3 = (Person3) demo.newInstance();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    person3.setAge(22);
    person3.setName("南城的人");
    person3.display();
    System.out.println(person3);
     }
  }
【运行结果】:
姓名=南城的人,年龄=22
[南城的人 22]

但是注意一下,当我们把Person中的默认的无参构造函数取消的时候,
比如自己定义只定义一个有参数的构造函数之后,会出现错误:

比如我定义了一个构造函数:

public Person(String name, int age) {
    this.age=age;
    this.name=name;
}
然后继续运行上面的程序,会出现:

java.lang.InstantiationException: Reflect.Person
at java.lang.Class.newInstance0(Class.java:340)
at java.lang.Class.newInstance(Class.java:308)
at Reflect.hello.main(hello.java:39)
Exception in thread "main" java.lang.NullPointerException
at Reflect.hello.main(hello.java:47)

所以大家以后再编写使用Class实例化其他类的对象的时候,
一定要自己定义无参的构造函数

【案例4】通过Class调用其他类中的构造函数 (也可以通过这种方式通过Class创建其他类的对象)

public class Person4 {
private String name;
private int age;

public Person4(int age, String name) {
    this.age = age;
    this.name = name;
}
public Person4(int age) {
    this.age = age;
}
public Person4(String name) {
    this.name = name;
}
public Person4() {
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getAge() {
    return age;
}
public void setAge(int age) {
    this.age = age;
}
@Override
public String toString(){
    return "["+this.name+"  "+this.age+"]";
  }
}
【运行结果】:
[null  0]
[南城的人  0]
[null  22]
[南城的人  22]

【案例5】 返回一个类实现的接口:

  public interface China {
public static final String name="南城";
public static  int age=20;
public void sayChina();
public void sayHello(String name, int age);
}

public class Person5 implements China {
private String sex;
public Person5(String sex) {
    this.sex = sex;
}
public String getSex() {
    return sex;
}
public void setSex(String sex) {
    this.sex = sex;
}
@Override
public void sayChina() {
}
@Override
public void sayHello(String name, int age) {
   }
}

public class Testit5 {
public static void main(String[] args) {
    Class<?> demo = null;
    try {
        demo = Class.forName("reflect5.Person5");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
//        保存所有接口的数组
    Class<?> intes[] = demo.getInterfaces();
    for (int i = 0; i < intes.length; i++) {
        System.out.println("实现的接口  " + intes[i].getName());
    }
   }
}
【运行结果】:
  实现的接口  reflect5.China

(注意,以下几个例子,都会用到这个例子的Person类,所以为节省篇幅,此处不再粘贴Person的代码部分,只粘贴主类hello的代码)

【案例6】:取得其他类中的父类

 public class Testit6 {
public static void main(String[] args) {
    Class<?> demo = null;
    try {
        demo = Class.forName("reflect5.Person5");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    Class<?> temp = demo.getSuperclass();
    System.out.println("继承的父类 " + temp.getName());
    }
}
【运行结果】:
 继承的父类 java.lang.Object

感谢http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html

相关文章

  • Java反射机制入门

    Java反射机制入门 一、什么是反射 JAVA反射机制(The JAVA reflection mechanism...

  • 反射之一

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • 反射之二

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • Java基础之反射

    Java基础之—反射(非常重要)Java中反射机制详解Java进阶之reflection(反射机制)——反射概念与...

  • 反射之三

    总结内容源自以下文章 粗浅看java反射机制 反射机制应用实践 谈谈java反射机制 Java Reflectio...

  • java反射机制

    java的反射机制 1 JAVA的反射机制是什么?反射机制能做什么?反射机制的优点与缺点2 认识 Class...

  • Java中反射的用途

    Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在。灵活掌握Java反射机制,对大家以后学习框...

  • Chapter 13 . 反射机制

    阅读原文 Chapter 13 . 反射机制 13.1 Java反射机制研究及应用 Java Reflection...

  • 详解Java反射机制(Reflection)

    详解Java反射机制(Reflection) 反射机制的作用 JAVA反射机制是在运行状态中,对于任意一个类,都能...

  • Java 反射机制

    [1]. java反射详解[2]. Java Reflection(反射机制)详解[3]. 深入理解Java类型...

网友评论

      本文标题:Java反射机制

      本文链接:https://www.haomeiwen.com/subject/ixkwattx.html