Java反射机制

一:Class对象的机制与实现

新建两个Java文件

1、Book.java

package com.cc.reflection;

public class Book {
	
	private int id;
	private String name;
	private String type;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	

}


2、Test.java

package com.cc.reflection;

public class Test {

	public static void main(String[] args) {
		// 三种获取类对象的方法

		Class demo1 = null;
		Class demo2 = null;
		Class demo3 = null;

		// 通过class的静态forName方法
		try {
			demo1 = Class.forName("com.cc.reflection");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(demo1);
		// 通过类的实例化对象来获取类
		Book book = new Book();
		Object object = book;
		System.out.println(object.getClass());

		// 直接利用类名获取对象
		demo3 = Book.class;
		System.out.println(demo3);
		// 通过类对象来获取一个对象
		try {
			Book bo1 = (Book) demo3.newInstance();
			System.out.println("实例化后的对象" + bo1);
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}


运行结果:



二、Filed对象的机制与实现

Java.lang.reflect.Field,是用于表示类中,接口中属性对象的类

可以操作类中私有,以及公有等全部属性和属性的信息

新建FieldTest.java


package com.cc.reflection;

import java.lang.reflect.Field;

import org.apache.jasper.tagplugins.jstl.core.ForEach;

public class FieldTest {

	//该方法用于使用传递过来的Class对象·获取类中的属性
	public void show(Class class1){ 
		
		//getDeclaredField和getField的方法区别在于,可以将私有属性获取到,而后者只能获得公有属性
		Field[] fi=class1.getDeclaredFields();
		for(Field ff:fi){
			System.out.println(ff.getName());
			System.out.println(ff.getType());
			
		}
		//使用另外一种方式获取类中的属性
		Field[] fi1=class1.getFields();
		for(Field ff:fi1){
			System.out.println(ff.getName());
			System.out.println(ff.getType());
			
		}
	}
	
	//该方法用于使用传递过来的实体类对象获取属性以及属性的值
	public void show (Object obj){
		Class class1=obj.getClass();
		Field[] fields=class1.getDeclaredFields();
		for(Field ff : fields){
			try {
				
				//需要设置访问权限,要不然无法访问
				ff.setAccessible(true);
				System.out.println(ff.getName()+"值"+ff.get(obj));
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
	
	
	
	public static void main(String[] args){
		Book bo=new Book();
		bo.setId(1);
		bo.setName("什么鬼");
		bo.setType("科幻");
		
		FieldTest fTest=new FieldTest();
		fTest.show(Book.class);
		
		fTest.show(bo);
		
	}
}

运行结果


三、Method对象的机制与实现

可以操作类中私有公有等全部方法

MethodTest.java

package com.cc.reflection;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class MethodTest {

	//该方法用于获取对象的所有方法名称,返回类型,以及参数信息
	public void show(Object obj)
	{
		Class class1=obj.getClass();
		Method[] me =class1.getDeclaredMethods();
		for(Method mm:me){
			System.out.println("方法名称"+mm.getName());
			System.out.println("方法修饰符"+Modifier.toString(mm.getModifiers()));
			System.out.println("方法返回值"+mm.getReturnType());
			Class[] preType=mm.getParameterTypes();
	        System.out.println("方法参数列表");
			for(Class class2:preType )
			{
				System.out.println(class2.getName());
			}
			
		}
		
	}
	//该方法用于使用传递过来的实体对象,获取其中的方法并调用
	public void showUse(Object obj){
		Class class1=obj.getClass();
		try {
			Method method=class1.getMethod("getName", null);
			//对获取的方法进行调用
			method.invoke(obj, new Object[0]);    //method.invoke的第二个参数是object的一个数组
			
			Method method1=class1.getMethod("setName", String.class);
			//对获取的方法进行调用
			method1.invoke(obj, "西游记");    //method.invoke的第二个参数是object的一个数组
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	
	
	
	public static void  main(String[] args)
	{
		Book book=new Book();
		book.setId(1);
		book.setName("盛开的滑稽");
		book.setType("惊悚");
		MethodTest mTest=new MethodTest();
	//	mTest.show(book);
		mTest.showUse(book);
		System.out.println(book.getName());
	}
}


运行结果




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值