Java反射机制浅析


  •  概念:

Java反射技术:允许程序在执行期取得任何已知名称的类的任何内部信息。包括:包名、类名、属性、内部类、结构体、方法,并可以在执行期变更字段内容和唤起方法。

 

  •   使用步骤:

 

使用反射机制的步骤:

获取你操作类的Class对象->获取类中的信息->使用Reflection API操作这些信息(设置字段值、调用方法等)

使用反射机制步骤的相关函数:

              forName(...)->newInstance()->getDeclaredConstructors()/getDeclaredFields()/getDeclaredMethods()等->Constructor/Method/Field类中的相关方法

注:private字段方法需要setAccessible()

 

  •   关键API解析:

反射机制中的主要包和类: java.lang.reflect、java.lang.Class

 

java.lang.reflect中

类Constructor、Field、Method继承自java.lang.reflect.AccessibleObject

1.   AccessibleObject类提供了将反射的对象标记为在使用时取消默认Java语言访问控制检查的能力。

关键方法:

public static void setAccessible(AccessibleObject[] array,Boolean flag)

public void setAccessible(Booleanflag)

值为true则指示反射的对象在使用时应该取消Java语言访问检查。

 

2.      public final class Construcor<T>extends AccessibleObject

提供了构造函数的修饰、名称、参数、参数类型等一系列方法。

关键方法:

public T newInstance(Object…initargs):使用此Constructor对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。

 

3.      public final class Fieldextends AccessibleObject

提供了获取Field的修饰、字段名称、字段类型、字段的值、设置字段的值的一系列方法。

关键方法:

public Object get(Object obj):返回指定对象上此Field表示的字段的值。类似的有getInt(Objectobj),getFloat,getDouble等

public void set(Object obj,Object value):将指定对象变量上此Field对象表示的字段设置为指定的新值。类似的有setBoolean(Object obj,Boolean z)等。

 

4.      public final class Methodextends AccessibleObject

提供获取Method的名称、修饰、参数类型、返回值类型等一系列相关的方法.

关键方法:

public Object invoke(Objectobj,Object… args):调用该方法

Obj:从中调用底层方法的对象;

args:用于方法调用的参数。

 

 

java.lang.Class中:

1.      提供了获取类中的字段、方法、构造方法、父类、此类的包等一系列的方法

关键方法:

public static Class<?>forName(String className):Class实例化对象

public T newInstance():类className的一个实例化对象。


注意:上述方法的返回值就是定义在java.lang.reflect中的Constructor、Field、Method。

 

  •   具体实例:

 

_reflection类:将被反射调用的类

public class _reflection {
	private String username = "LiZZZZZQQQQ";
	private String password = "woyebuzhidao";
	
	private void printData1(){
		System.out.println("来自private void printData1()");
		System.out.println("username:"+username+"|"+"password:"+password);
	}
	public void printData2(){
		System.out.println("来自public void printData2()");
		System.out.println("username:"+username+"|"+"password:"+password);
	}
}

mainRefelction类:反射调用_reflection类中的字段方法

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;


public class mainRefelction {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			//第1步:获取要操作类的Class实例
			Class class1 = Class.forName("_reflection");//Class的实例化
			Object object = class1.newInstance();//_reflection的实例化
			
			//第2步:获取要操作类中的字段与方法
			Field fields[] = class1.getDeclaredFields();
			Method methods[] = class1.getDeclaredMethods();
			
			//调用Field中的方法,设置和输出字段的值
			int num1 = fields.length;
			for(int i=0;i<num1;i++){
				//取消Java语言访问检查
				fields[i].setAccessible(true);
				System.out.println(fields[i].getName()+":"+fields[i].get(object));
			}
			
			//设置某个确定Field的值
			Field field = class1.getDeclaredField("password");
			field.setAccessible(true);
			field.set(object, "012345789");
			
			//调用_reflection中的方法
			int num2 = methods.length;
			for(int j=0;j<num2;j++){
				methods[j].setAccessible(true);
				methods[j].invoke(object, null);
			}			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

结果:


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值