Java.lang.reflect 下的Class,Method,Field的使用实例

本文目录:一、自己编写的反射练习的Demo; 

                    二、编写一个实例,如何通过反射获取一个类中private 字段的值

-------------------------------------------------------------------------------------------------------------------------------------------

一、自己编写的反射练习的Demo; 

建立一个实体:Book.java

package testdb;

import java.math.BigDecimal;

public class Book {
	private int id;
	private String book_Type;
	private String book_Name;
	public BigDecimal sale_Price;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getBook_Type() {
		return book_Type;
	}
	public void setBook_Type(String book_Type) {
		this.book_Type = book_Type;
	}
	public String getBook_Name() {
		//System.out.println("掉眼泪该方法,book_Name:"+book_Name);
		return book_Name;
	}
	public void setBook_Name(String book_Name) {
		this.book_Name = book_Name;
	}
	public BigDecimal getSale_Price() {
		return sale_Price;
	}
	public void setSale_Price(BigDecimal sale_Price) {
		this.sale_Price = sale_Price;
	}
	 
	
}

2、编写实例 main 类

package testdb;

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

public class BookTest {
	//------------Class 3种方式获得类对象
	public void classTest() throws InstantiationException, IllegalAccessException{
		
		Class demo1=null;
		Class demo2=null;
		Class demo3=null;
		try {
			//1、类对象   Class.forName()
			demo1 = Class.forName("testdb.Book");
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("第一种方式(Class.forName()):-----------"+demo1);
		//-------------------方式2开始------------------------------
		Book book = new Book();
		Object ob  =book;
		System.out.println("第2种方式:ob.getClass()= ---------------"+ob.getClass());
		System.out.println("第2种方式:book.getClass()= ---------------"+book.getClass());
		//---------------------方式3开始-------------------------------------
		demo3 = Book.class;
		System.out.println("第三种方式获取类对象(demo3 = Book.class;):----------"+demo3);
		//-----------------------将类对象实例化-----------------------------------------------
		System.out.println("将类对象实例化: "+demo3.newInstance());
	}
	
	//------------Field
	public  void showClass( Class cl ){
		 Field [] fl = cl.getDeclaredFields();//得到类的所有对象(可以将私有属性获取出来)
		 for(Field fl1:fl){
			System.out.println("对象名称----"+fl1.getName()); fl1.getName();//获取对象的名称
			System.out.println("对象类型----"+fl1.getType());fl1.getType();//获取属性对象类型
		 }
		 System.out.println("-----------------------------------------------------------");
		 
		 Field [] fle = cl.getFields();//得到类的所有对象(只可以将公有属性获取出来)
		 
		 for(Field fl1:fle){
				System.out.println("对象名称222----"+fl1.getName()); fl1.getName();//获取对象的名称
				System.out.println("对象类型----"+fl1.getType());fl1.getType();//获取属性对象类型
			 }
	}
	public  void showClass(Object ob) throws IllegalArgumentException, IllegalAccessException{
		Class cl = ob.getClass();
		Field [] fl = cl.getDeclaredFields();//得到类的所有对象(可以将私有属性获取出来)
		 for(Field fl1:fl){
			 fl1.setAccessible(true);
			System.out.println("对象名称ob----"+fl1.getName()+"---"+fl1.get(ob)); fl1.getName();//获取对象的名称
			 
		 }
	}
	//------------------------Method1------------获取类对象方法
	public void showMethod(Object ob) throws ClassNotFoundException{
		Class cl =  ob.getClass();
		Method [] methods = cl.getDeclaredMethods();//获得对象的所有方法
		for(Method med:methods){
			System.out.println("方法名----"+med.getName()); //获取对象方法名
			System.out.println("方法修饰符----"+Modifier.toString(med.getModifiers()));//public  private ...
			System.out.println("方法返回值类型----"+med.getReturnType());//方法返回值
			//方法参数列表 set方法
			Class[] proType= med.getParameterTypes();
			System.out.println("方法参数列表");
			for(Class type:proType){
				System.out.println("参数类型:"+type.getName());
			}
		}
	}
	//--------------------Method2---------------------------操作类对象值
	public void showMethod2(Object ob) throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
		Class cl = ob.getClass();
		 Method me = cl.getMethod("getBook_Name", null);
		 me.invoke(ob, null);
		 System.out.println(me.invoke(ob, null));
		 System.out.println("---------------------------------");
		 Method me2 = cl.getMethod("setBook_Name", String.class);
		 me2.invoke(ob, "平凡的世界");//相当于book.setBook_Name 设值方法
		 
		 Method me3 = cl.getMethod("getBook_Name", null);
		 me3.invoke(ob, null);
		 System.out.println(me3.invoke(ob, null));//相当于book.getBook_Name 取值方法
	}
	

	/**
	 * @param args
	 * @throws ClassNotFoundException 
	 * @throws IllegalAccessException 
	 * @throws IllegalArgumentException 
	 * @throws InstantiationException 
	 * @throws InvocationTargetException 
	 * @throws NoSuchMethodException 
	 * @throws SecurityException 
	 */
	public static void main(String[] args) throws ClassNotFoundException, IllegalArgumentException, IllegalAccessException, InstantiationException, SecurityException, NoSuchMethodException, InvocationTargetException {
		// TODO Auto-generated method stub
		//新建一本书
		Book book = new Book();
		Class cl= Class.forName("java.lang.String");
		book.setId(1);
		book.setBook_Name("《和空姐同居的日子》");
		book.setBook_Type("言情");
		//
		BookTest bt = new BookTest();
		//bt.classTest();
		//bt.showClass(book);
		//bt.showClass(Class.forName("testdb.Book"));
		bt.showMethod2(book);
		
		System.out.println(book.getBook_Name());
	}

}


二、编写一个实例,如何通过反射获取一个类中private 字段的值

1、编写一个实体:

package ww;

public class BeanTest {  
    private int count;
    public <span style="font-family: Arial, Helvetica, sans-serif;">BeanTest</span><span style="font-family: Arial, Helvetica, sans-serif;">(String str) {</span>
		super();
		this.count = str.length();
	}
	 
}

2、main 代码:

public class demoTest {
        public static void main(String[] args) throws Exception{
               <span style="font-family: Arial, Helvetica, sans-serif;">beanTest</span><span style="font-family: Arial, Helvetica, sans-serif;">  </span><span style="font-family: Arial, Helvetica, sans-serif;"> test = new   </span><span style="font-family: Arial, Helvetica, sans-serif;">beanTest</span><span style="font-family: Arial, Helvetica, sans-serif;">("abcdsef");</span>
		 
		Field f = beanTest.class.getDeclaredField("count");
		//其中,最关键的代码是:
		//f.setAccessible(true);
		//这行代码把对象data上的name字段设置为public访问属性.
		f.setAccessible(true);
		System.out.println(f.get(test));

 }

}

运行结果:7

PS----确实不是很清楚,java 的一大特性就是封装,保障数据安全;  但是这里却能通过反射访问被封装的数据。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值