黑马程序员_java的反射机制

本文深入探讨Java反射机制,通过实例展示了如何使用反射获取类的构造函数、成员变量和成员方法,并进行相应操作。包括构造函数的反射、成员变量的反射和成员方法的反射,以及涉及的关键API如Class、Constructor、Field和Method的使用。

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

------- android培训java培训、期待与您交流! ----------



1,反射(java运行过程中解剖一个类)

*在运行过程中能动态的得到类的所有信息,以及能动态的调用对象的成员的这样一种java机制称为反射

*Java中的每一种类型都有一个对应的字节码文件对象

*类是用来描述事物的,那么对于类是不是也可以用一个类来描述(可以把这个类称为类的描述类),这个类为Class




2,既然反射能得到类的信息,那么就从类的各个组成部分分析(构造函数,成员方法,成员变量),看java如何反射得到这些部分



*反射构造函数

import java.lang.reflect.Constructor;


/*
 掌握:
 构造方法的反射 
  
  */
public class _6_ReflectTest2 
{
	public static void main(String[] args) throws Exception
	{
		String str=new String(new StringBuffer("abc"));
		System.out.println(str);
		
		Class cla=String.class;
		Constructor cons=cla.getConstructor(StringBuffer.class);
		String str2=(String)cons.newInstance(new StringBuffer("abc"));
		System.out.println(str2);
		
	}

}




*反射成员变量

import java.lang.reflect.Field;

/*
 掌握:
 成员变量的反射 
 
  
  */

public class _6_ReflectTest3 
{
	public static void main(String[] args) throws Exception
	{
		ReflectPoint rp=new ReflectPoint(3,5);
		
		
		//Field fieldY=rp.getClass().getField("y");
		//int y=(Integer)fieldY.get(rp);
		//System.out.println(y);
		
		Field fieldX=rp.getClass().getDeclaredField("x");
		fieldX.setAccessible(true);
		int x=(Integer)fieldX.get(rp);
		System.out.println(x);
		
		changeStringValue(rp);
		System.out.println(rp);
	}

	private static void changeStringValue(Object obj) throws Exception
	{
		Class cla=obj.getClass();
		Field[] fields=cla.getFields();
		for(Field field:fields)
		{
			if(field.getType()==String.class)
			{
				String oldStr=(String)field.get(obj);
				String newStr=oldStr.replace('b', 'a');
				field.set(obj, newStr);
			}
		}
	}

}



*成员方法的反射

import java.lang.reflect.Method;

/*

	成员方法的反射
	
*/
public class _7_ReflectTest 
{
	public static void main(String[] args) throws Exception
	{
		String str="abcd";
		
		System.out.println(methodCharAt(str));
		
	}

	private static Object methodCharAt(Object obj) throws Exception
	{
		Class cla=obj.getClass();
		Method me=cla.getMethod("charAt", int.class);
		return me.invoke(obj, 1);
		
	}

}


3,反射涉及API

Class
public Constructor<?>[] getConstructors()
public Constructor<T> getConstructor(Class<?>... parameterTypes)
public T newInstance()
public Field getField(String name)
public Field getDeclaredField(String name)
public Method getMethod(String name,Class<?>... parameterTypes)
public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
public boolean isPrimitive()


Constructors
public T newInstance(Object... initargs)

Field
public void setAccessible(boolean flag)
public Object get(Object obj)
public Class<?> getType()
public void set(Object obj,Object value)

Method
public void setAccessible(boolean flag)
public Object invoke(Object obj,Object... args)





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值