java反射的初步练习

本文深入讲解Java反射机制的基础知识及应用场景,介绍如何通过Class对象获取类信息,展示构造方法、成员变量及成员方法的获取方式,并提供实战案例。

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

反射的应用范围

 编写框架,和复用很高的程序。

反射的初步理解

 java程序中的java类属于同于类事物, 描述这一类事物的java类名就是Class,

通过Class类就可以获取这个类的各种信息 一个java类代表一份字节码文件,

每一份字节码文件就是一个 Class实体对象
Class对象的三种获取方式

  Class对象的1三种获取方式
  (1)类名.class
  (2)对象名.getClass
  (3)Class.forName("完整的java路径名(包名+类名)");
  注:
  ①一份字节码文件已经加载到内存中区了,找到字节码文件并返回
  ②字节码不存在,用类加载器去加载,缓存后到虚拟机并返回

<span style="font-size:24px;">public class Class_Demo01 {

	public static void main(String[] args) throws Exception {
			String s1="今天是个好天气";
			String s2="哈哈哈";
			<span style="color:#33cc00;">//三种获取方式</span>
			Class c1=s1.getClass();
			Class c2=String.class;
			Class c3 =Class.forName("java.lang.String");<span style="color:#33cc00;">//此处会有异常,因为你不能保证你的完整类名一定正确</span>
			<span style="color:#33cc00;">//判读是否是同一份字节码文件</span>
			System.out.println(c1==c2);
			System.out.println(c1==c3);
			<span style="color:#33cc00;">//判读是否是基本类型</span>
			System.out.println(c1.isPrimitive());
			 <span style="color:#33cc00;"> //判读是否是数组类型</span>
			System.out.println(int[].class.isArray() );
	}

}</span>
反射获取----构造方法Constructor

<span style="font-size:24px;">public static void demo_Counstructor() throws Exception {
		<span style="color:#009900;">// 获取所有的构造方法</span>
		Constructor[] constructor = Class.forName("java.lang.String")
				.getConstructors();

		<span style="color:#33cc00;">// 获取指定的构造方法-------获取String类中的 String(StringBuilder str) 的这种构造</span>
		Constructor con = String.class.getConstructor(StringBuilder.class);<span style="color:#33cc00;">// :这里的StringBuilder是指选择了String内中一个参数为StringBuilder的构造方法</span>
		String  s =(String) con.newInstance(new StringBuilder("哈哈是个好天气"));<span style="color:#33cc00;">//这里的StringBuilder是指用这个构造方法创建对象时,需要传递一个StringBuider的对象</span>		
		System.out.println(s.charAt(2));
	
		<span style="color:#33cc00;">//用Class.newInstance获取对象的默认的构造方法 </span>
		String  s2	=	(String)Class.forName("java.lang.String").newInstance();
		System.out.println(s2==null); 
	
	}</span><span style="font-size:18px;font-weight: bold;">			</span>
反射获取------成员变量Field
<span style="font-size:24px;">public static void demo_Field() throws Exception{
		Fs_Demo fs=new Fs_Demo(5, "哈哈");
		
		Field f1=fs.getClass().getField("a");<span style="color:#33cc00;">//f1不代表具体的值</span>
		<span style="color:#33cc00;">//f1不是对象身上的变量,而是类上,要用它去取某个对象上对应的值
		//获取值</span>
		System.out.println(f1.get(fs));
		
		
		Field f2=fs.getClass().getDeclaredField("name");<span style="color:#33cc00;">//强制获取可见和不可见(private)的成员</span>
		f2.setAccessible(true);<span style="color:#33cc00;">//强制设置可访问</span>
		System.out.println(f2.get(fs));
	}</span>
反射获取---成员方法Method
<span style="font-size:24px;">public static void demo_Method() throws Exception{
		String s="方法是个好好的";
		Method method=String.class.getMethod("charAt", int.class);<span style="color:#33cc00;">//参数一:方法名  ; 参数二:因为每一种方法都有多种重载形式
									//所以需要用这个方法的参数.class 来明确这个方法</span>
		<span style="color:#33cc00;">//String.class.getDeclaredMethod(name, parameterTypes)//获取所有的方法,包括私有</span>
		System.out.println(method.invoke(s, 2));<span style="color:#33cc00;">//调用方法
		//method.invoke(s, 2) 当第一个参数为null时,那么代表method对象对应的是一个静态方法</span>
	}</span>
反射练习

<span style="font-size:24px;">package 反射基础;

import java.lang.reflect.Field;

public class Class_Demo03_Field01 {

	<span style="color:#33cc00;">/**
	 * 要求:利用反射将字符串中含有b的改成a 
	 * @throws Exception 
	 * @throws  
	 */</span>
	public static void main(String[] args) throws  Exception {
		Fs_Demo f=new Fs_Demo(5, "哈哈");
		<span style="color:#33cc00;">//第一步获取所有的字段</span>
		Field [] fields=f.getClass().getFields();
		
		for (Field field : fields) {
			<span style="color:#33cc00;">//field.getType().equals(String.class); //因为字节码文件只有一份,建议在比较字节码时用==比较好</span>
			if (field.getType()==String.class) {
					String  sValue	=(String)field.get(f);<span style="color:#33cc00;">//获取</span>
					System.out.println(sValue);

					sValue=sValue.replace("b", "a");<span style="color:#33cc00;">//替换 </span> 
					System.out.println(sValue);
			}
		}

	}

}</span>


<span style="font-size:24px;">package 反射基础;

public class Fs_Demo {

	     	 public  int a;
	     	private String name;
	     	public String  string="bdsbdsbbsbabsa";
	     	public String  string2="bkdlflsklfb";
	     	public Fs_Demo(int a, String name) {
			super();
			this.a = a;
			this.name = name;
		}
		
}</span><strong style="font-size:18px;">
</strong>


数组的反射练习

<span style="font-size:24px;">package 反射基础;

import java.lang.reflect.Array;

public class Class_Demo04 {

	<span style="color:#33cc00;">/**
	 * 数组的反射练习 注:具有相同的维度且又具有相同的元素类型是同一种类型
	 * 
	 */</span>
	public static void main(String[] args) {
		int[] a1 = new int[] { 5, 6, 8, 4 };
		int[] a2 = new int[4];
		int[][] a3 = new int[2][3];
		String[] s = new String[4];

		System.out.println(a1.getClass() == a2.getClass());<span style="color:#33cc00;">// 判读两个数组的字节码是否是同一类型</span>

		<span style="color:#33cc00;">/*
		 * System.out.println(a1.getClass()==a3.getClass());//编译出错:不兼容的操作数类型类<捕获#
		 * //3吗?扩展int[]类>和<捕捉# 4 ?扩展int[][]>
		 * System.out.println(a1.getClass()==s.getClass());
		 */
		// 是同一个父类</span>
		System.out.println(a1.getClass().getSuperclass().getName());<span style="color:#33cc00;">// 父类</span>
		System.out.println(a3.getClass().getSuperclass().getName());

		printObject(a1);
		printObject("sdfsgfd");
	}

	<span style="color:#33cc00;">// 功能:打印数组</span>
	public static void printObject(Object obj) {
		Class c = obj.getClass();
		if (c.isArray()) {<span style="color:#33cc00;">// 是数组</span>
			int len = Array.getLength(obj);<span style="color:#33cc00;">// 获取数组长度</span>
			for (int i = 0; i < len; i++) {
				System.out.println(Array.get(obj, i));<span style="color:#33cc00;">// 取出元素</span>
			}
		} else {
			System.out.println(obj);
		}
	}

}</span><strong style="font-size:18px;">
</strong>





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值