黑马程序员--基础加强--第六篇--反射

本文深入探讨了Java反射机制的核心概念,包括如何获取类的字节码文件、Class对象的使用方法及常见API介绍,并通过实例演示了反射在数组操作中的应用。

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

ASP.Net+Android+IOS开发.Net培训期待与您交流!

数组的反射
1具有相同维数和元素类型的数组属于同一类型,即具有相同的Class实例对象
2代表数组的Class实例对象的getSuperClass()方法返回的父类为Objece类对应的Class
3基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既能当作Object类型使用,又可以当作Object[]类型使用
4Arrays.asList()方法处理int[] 和String[]时的差异
5Array工具类用于完成对数组的反射1.什么叫反射?

JAVA中的类有很多,这些类同属一类事物,描述这些事物的JAVA类就是Class。

对比提问,众多的人用Person表示,众多的java类用Class表示。

Person类的实例为各个具体的人,张三李四,那么Class的实例代表什么呢?那就是各个java类在内存中的字解码文件,
例如Array,Math在内存中的字节码文件,当然各个类在内存中的字节码文件都是不同的,这些字节码文件类似,这就
相当于每个对象。

2.如何得到这些类的字节码对应的实例对象呢?


类名.class,例如System.class任何类型都可以用class得到他的字节码文件 数组 void 
对象名.getClass(),例如 new Integer().getClass()

Class.forName("类名的绝对路径")  例如Class.forName("java.util.Properties")


Class.isArray() 
          判定此 Class 对象是否表示一个数组类。
Class.isMemberClass() 
          当且仅当底层类是成员类时返回 true。
 

最重要一句话,就是反射就是把java中的各个成分(包,方法,构造方法,数据)映射成相应的类

3:Class常用方法

Class.forName(String classname);

Class.getFiled()

Class.getFileds();

Class.getMethod();

Class.getConstruct(construct name);

Class.getConstructs();

isPrimitive()

4.练习

反射的基本练习

import java.lang.reflect.*;
public class RefTest{
	public static void main(String[] args)throws Exception{
		Integer a = 1;
		Class cl1 = a.getClass();
		Class cl2 = Integer.class;
		Class cl3 = Class.forName("java.lang.Integer");
		System.out.println(cl1 == cl2);
		System.out.println(cl1 == cl3);
		System.out.println(cl1.isPrimitive());//Integer不是一个基本类型
		System.out.println("int类型是否是基本类型");
		System.out.println(int.class.isPrimitive());//int是一个基本类型
		System.out.println("int 和 Integer是否产生同一字节码");
		System.out.println(int.class == Integer.class);
		System.out.println("int 和 Integer的实例是否是一字节码");
		System.out.println(int.class == Integer.TYPE);
		System.out.println("void的字节码");
		System.out.println(void.class);
		System.out.println("数组是不是基本类型");
		System.out.println(int[].class.isPrimitive());
		System.out.println("判断是否是数组类型");
		System.out.println(int[].class.isArray());
		
		Class.isArray();
		
		Constructor cos = String.class.getConstructor(StringBuilder.class);
		//Class也有newInstance,它调用的是类原有无参的构造方法,这样比较简便。
		String str = (String)cos.newInstance(new StringBuilder("abc"));
		System.out.println(str);
		
		ReflectPoint rp = new ReflectPoint(2,3);
		//此处filedY不代表值,代表类上的,他代表所有对象该值的抽象,取某个对象的值必须指定对象。
		Field fieldY = rp.getClass().getField("y");
		System.out.println(fieldY.get(rp));
	}
}
class ReflectPoint{
	private int x;
	public int y;
	public ReflectPoint(int x,int y){
		this.x = x;
		this.y = y;
	}
}
使用反射把一个字符串中的字母‘a’换成‘b’,数字加1

public static void replace(String p) throws IllegalArgumentException, IllegalAccessException{
		Field[] fs = p.getClass().getFields();
		for(Field f:fs){
			if(f.getType() == String.class){
				String oldValue =(String)f.get(p);
				String newValue = oldValue.replace('b', 'a');
				f.set(p, newValue);
			}else if(f.getType() == int.class){
				int oldValue = (Integer)f.get(p);
				int newValue = oldValue++;
				f.set(p, newValue);
			}
		}

使用反射查看类的私有变量

ReflectPoint rp = new ReflectPoint(2,3);
Field fieldX = rp.getClass().getDeclaredField("x");
fieldX.setAccessible(true);//x为私有的
System.out.println(fieldX.get(rp));


使用反射调用String的方法

//下面使用反射调用String的方法
Method method = str.getClass().getMethod("charAt", int.class);
System.out.println(method.invoke(str, 2));//invoke是把这个方法执行一下
//如果invoke的第一个参数是null,则代表该方法是静态方法

使用反射操作数据

应注意这几点:

1具有相同维数和元素类型的数组属于同一类型,即具有相同的Class实例对象

2代表数组的Class实例对象的getSuperClass()方法返回的父类为Objece类对应的Class

3基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既能当作Object类型使用,又可以当作Object[]类型使用

4Arrays.asList()方法处理int[] 和String[]时的差异

5Array工具类用于完成对数组的反射

public class ReflectTest {
	public static void main(String[] args){
		int[] arr1 = new int[]{1,2};
		int[] arr2 = new int[]{1,2,3};
		int[][] arr3 = new int[1][2];
		String[] arr4 = new String[]{"good","morning"};
		System.out.println(arr1.getClass() == arr2.getClass());
		System.out.println(arr1.getClass().getName());
		System.out.println(arr1.getClass().getSuperclass().getName());
		System.out.println(arr4.getClass().getSuperclass().getName());
		
		Object aObj1 = arr1;
		Object aObj2 = arr2;
		Object[] aObj3 = arr3;
		Object[] aObj4 = arr4;
		System.out.println(aObj1);
		System.out.println(aObj2);
		
		System.out.println(Arrays.asList(aObj1));
		System.out.println(Arrays.asList(aObj4));
		
		printObject(arr1);
		printObject("good");
	}
	
	private static void printObject(Object obj){
		if(obj.getClass().isArray()){
			for (int i = 0; i < Array.getLength(obj); i++) {
				System.out.println(Array.get(obj, i));
			}
		}else{
			System.out.println(obj);
		}
	}
}
class TestArguments{
	public static void main(String[] args){
		for(String arg:args){
			System.out.println(arg);
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值