反射01

本文深入解析Java反射机制的基础——Class类,并介绍如何通过反射获取类的各种成员,包括构造器、属性、方法及内部类等。同时探讨反射的应用场景及其带来的性能影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如要转载请标明作者zjrodger和出处:http://blog.youkuaiyun.com/zjrodger/,谢谢微笑

                                                 笔记目录
(·) 透彻分析反射的基础_Class类
(·) 反射Reflection概述
(·) 利用反射得到类的各个成员的Java对象




(·) 透彻分析反射的基础_Class类

1. 反射的基石:Class类
2.  得到某个类的字节码对应的 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的内存中,此时,就需要类加载器先从硬盘中加载目标类的字节码,把加载过的字节码缓存在虚拟机中,然后再返回该字节码。 

 在做反射时,主要用的是 方法来返回字节码,因为,在写反射时,还不知道目标类。另外, 反射的作用就是用来做框架 .
代码示例:
Class.forName("字符串类型的变量");
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();
		}
	}
}

【参考资料】
1. 张孝祥_Java高新技术_2010年录制,17_透彻分析反射的基础_Class类。

(·) 反射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");
								
	}
}







 





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值