java反射(一)--认识反射机制

一.认识java反射机制
  在java语言中,之所以会有如此众多的开源技术支撑,很大的一部分来源于java最大特征--反射机制.能够灵活的去使用反射机制进行项目的开发与设计,才能够真正接触到java的精髓.所有的技术实现的目标只有一点:重用性.
--对于反射技术,首先应该考虑"反"与"正"的概念,所谓的"正"操作指的是当你要使用一个类的时候,要先导入程序所在的包,而后根据类进行对象的实例化,并且依靠对象调用类中的方法.但是"反"则为,根据实例化对象,反推出其类型.
--范例:正向操作

 1 package 反射.认识反射机制;
 2 
 3 import java.util.Date;      //1.当如程序所在的包,知道对象的出处
 4 
 5 /**
 6  * @author : S K Y
 7  * @version :0.0.1
 8  */
 9 public class Demo {
10     public static void main(String[] args) {
11         Date date = new Date();     //2.通过类产生实例化对象
12         System.out.println(date.getTime());     //3.根据对象调用类中的方法
13     }
14 }

--如果想要实现"反"的操作,那么首先要采用的就是Object类中所提供的操作方法:public final native Class<?> getClass()
--范例:观察getClass()的应用

1 public class GetClassDemo {
2     public static void main(String[] args) {
3         Date date = new Date();
4         System.out.println(date.getTime());
5         //根据实例化对象得到其所属的类型
6         System.out.println("date: " + date.getClass());
7     }
8 }

--运行结果

1566916084454
date: class java.util.Date

Process finished with exit code 0

二.Class类对象的三种实例化方式
  反射之中的所有的核心操作都是通过Class类对象展开的,Class类是反射操作的根源所在,但是这个类如果要想获取他的实例化对象,可以采用三种方式完成,首先观察Class类的定义:

public final class Class<T> implements java.io.Serializable,
GenericDeclaration,
Type,
AnnotatedElement

--从JDK1.5开始Class类在定义的时候可以使用泛型进行标记,这样的用法主要啊是希望可以避免所谓的向下转型.
--1.Object类支持,Object类可以根据实例化对象获取Class对象:public final native Class<?> getClass()

1 public class ClassDemo {
2     public static void main(String[] args) {
3         Person person = new Person();   //已经存在有指定类的实例化对象
4         Class<? extends Person> cls = person.getClass();
5         System.out.println(cls);    
6         System.out.println(cls.getName());  //获取类的完成名称 
7     }
8 }

--这种方式存在一个不是缺点的缺点:如果现在只是想获得Class类对象,则必须产生指定类对象后才可以获得.
--2.JVM直接支持:采用类.class的形式实例化:此种形式需要导入类所在的开发包

1 public class ClassDemo {
2     public static void main(String[] args) {
3         Class<? extends Person> cls = Person.class;
4         System.out.println(cls);
5         System.out.println(cls.getName());  //获取类的完成名称
6     }
7 }

--3.Class类支持,在Class类中提供有一个操作的static方法:public static Class<?> forName(String className)throws ClassNotFoundException:

1 public class GetClassDemo {
2     public static void main(String[] args) throws ClassNotFoundException {
3         //此时Person类位于 entity包中
4         Class<?> aClass = Class.forName("反射.认识反射机制.entity.Person");
5         System.out.println(aClass);
6     }
7 }

--这种模式最大的特点是可以直接采用字符串的形式定义要使用的类型,并且程序中不需要编写任何的import语句,如果此时无法找到要使用的程序类,则会出现如下异常

Exception in thread "main" java.lang.ClassNotFoundException: 反射.认识反射机制.entity.A
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at 反射.认识反射机制.GetClassDemo.main(GetClassDemo.java:12)

Process finished with exit code 1
posted @ 2019-08-27 22:50  灰色天空_graySky  阅读(231)  评论(0编辑  收藏  举报