如要转载请标明作者zjrodger和出处:http://blog.youkuaiyun.com/zjrodger/,谢谢。
笔记目录
(·) 透彻分析反射的基础_Class类
(·) 反射Reflection概述
(·) 利用反射得到类的各个成员的Java对象
|
(·) 透彻分析反射的基础_Class类
方法一:
(1)
语法:类名.class
(2)代码示例:
System.class
|
方法二:
(1)
语法:Obj.getClass();方法
(2)代码示例:
Person p1 = new Person();
Class cls1 = p1.getClass(); // Person类的字节码
如果类在一个包里,则包的名字也作为类名的一部分。
(3)特点:目标类的字节码(Class对象)已经在JVM的内存中了(已经被加载过了),此时,就不需要JVM再从硬盘中加载目标类的字节码了。
|
方法三:
(1)语法:Class.forName(
参数);
参数值:某个类的全限定名(必须添加完整的包名)
(2)代码示例:
①Class.forName("java.lang.String");
②String className=“oracle.jdbc.driver.OracleDriver”; Class.forName(className); 获得 OracleDriver 的类对象
(3)特点:目标类的字节码已经还没有在JVM的内存中,此时,就需要类加载器先从硬盘中加载目标类的字节码,把加载过的字节码缓存在虚拟机中,然后再返回该字节码。
|
package com.zjrodger;
public class ReflectionTest {
public static void main(String[] args) {
String str = "abc";
try {
Class strClass01 = String.class;
Class strClass02 = str.getClass();
Class strClass03 = Class.forName("java.lang.String");
System.out.println(strClass01.toString());
System.out.println(strClass02.toString());
System.out.println(strClass03.toString());
System.out.println("strClass01 == strClass02: "+(strClass01 == strClass02));
System.out.println("strClass01 == strClass03: "+(strClass01 == strClass03));
System.out.println("strClass02 == strClass03: "+(strClass02 == strClass03));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
(·) 反射Reflection概述
1.反射是什么
反射就是把java类中的各个成分(属性,方法,构造器,初始化代码块和内部类)映射成相应java类,从而达到使用各个成分的目的。
例如,一个MyPerson类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造函数,包等等信息也用一个个的Java类来表示。就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示MyPerson类的Class类显然要提供一系列的防范,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应的实例对象来表示,他们是Field、Method、Constructor、Package等等。
2.反射的缺点
反射的缺点:比较消耗性能。
3.为什么要使用反射
(1)程序在编译时根本无法预知对象和类可能属于哪些类,程序只能依靠运行时信息来发现该对象和类的真实信息,这就必须使用反射。
不知道类的名字,但是会被出入一个数组,若数组的第一个元素就是类名,
(2)反射的作用---->实现框架功能。
(·) 利用反射得到类的各个成员的Java对象
【实现功能】
通过Class对象的常用方法,用户可以获得类的各种成员:构造器,属性,方法,内部类等等
【代码示例】
package com.zjrodger;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
/**
* 学习了Class对象的常用方法。
* 实现功能:
* 通过Class对象的常用方法,用户可以获得类的各种成员:
* 构造器,属性,方法,内部类等等
* **/
public class GetClassMembersTest {
//为该类定义一个私有构造器
private GetClassMembersTest(){}
//为该类定义一个参数类型为String的构造器
public GetClassMembersTest(String name){
System.out.println("执行有String类型参数的构造器。");
}
//为该类定义一个参数类型为int的构造器
public GetClassMembersTest(int number){
System.out.println("执行有int类型参数的构造器。");
}
//定义一个无参数的info()方法
public void info(){
System.out.println("执行无参数的info()方法。");
}
//定义一个有参数的info()方法
public void info(String str){
System.out.println("执行有参数的info()方法,其str参数值为:"+str);
}
//定义一个有参数的info()方法
private void info(int number){
System.out.println("执行有参数的info()方法,其str参数值为:"+number);
}
//定义一个测试用内部类
public class Inner{}
public static void main(String[] args) throws SecurityException, NoSuchMethodException, ClassNotFoundException, Exception {
Class<GetClassMembersTest> c1 = GetClassMembersTest.class;
//获取ClassTest的Class对象所对应的全部构造器,
//不论该构造器的修饰符是public,protected,default还是private。
System.out.println("使用getDeclaredConstructors()方法,\n获取ClassTest的Class对象所对应的全部构造器,\n不论该构造器的修饰符是public,protected,default还是private。");
Constructor[] constructors01 = c1.getDeclaredConstructors();
for(Constructor c: constructors01){
System.out.println(c);
}
System.out.println("\n");
//获取该Class对象所对应的全部public构造器
System.out.println("使用getConstructors()方法,\n获取ClassTest的Class对象所对应的全部public构造器");
Constructor[] constructors02 = c1.getConstructors();
for(Constructor c: constructors02){
System.out.println(c);
}
System.out.println("\n");
//获取ClassTest的Class对象指定int参数类型的public构造器
System.out.println("使用getConstructor(int.class)方法,\n获取ClassTest的Class对象指定int参数类型的public构造器");
Constructor<GetClassMembersTest> constructors03 = c1.getConstructor(int.class);
System.out.println(constructors03);
System.out.println("\n");
//获取ClassTest的Class对象指定String参数类型的public构造器
System.out.println("使用getConstructor(String.class)方法,\n获取ClassTest的Class对象指定String参数类型的public构造器");
Constructor<GetClassMembersTest> constructors04 = c1.getConstructor(String.class);
System.out.println(constructors04);
System.out.println("\n");
//获取ClassTest的Class对象中的所有声明的方法。
System.out.println("使用getDeclaredMethods()方法,\n获取ClassTest的Class对象中的所有声明的方法。");
Method[] methods01 = c1.getDeclaredMethods();
for(Method m: methods01){
System.out.println(m);
}
System.out.println("\n");
//获取ClassTest的Class对象中的所有的public方法。
System.out.println("使用getDeclaredMethods()方法,\n获取ClassTest的Class对象中的所有的public方法。\n包括从java.lang.Object中继承而来的方法。");
Method[] methods02 = c1.getMethods();
for(Method m: methods02){
System.out.println(m);
}
System.out.println("\n");
//获取ClassTest的Class对象中指定的public方法。
System.out.println("使用getMethod(\"info\", String.class)方法,\n获取ClassTest的Class对象中指定的public方法。");
Method method03 = c1.getMethod("info", String.class);
System.out.println(method03);
System.out.println("\n");
//获取ClassTest的Class对象中所对应的全部内部类。
System.out.println("使用getDeclaredClasses()方法,\n获取ClassTest的Class对象中所对应的全部内部类。");
Class[] innerClasses = c1.getDeclaredClasses();
for(Class cl: innerClasses){
System.out.println(cl);
}
System.out.println("\n");
}
}