Java.lang.reflect 下的Class,Method,Field的使用实例
来源:互联网 发布:easygen3200软件下载 编辑:程序博客网 时间:2024/06/06 08:48
本文目录:一、自己编写的反射练习的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());}//------------Fieldpublic 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 0
- Java.lang.reflect 下的Class,Method,Field的使用实例
- 关于java.lang.reflect.Field 和 java.lang.reflect.Method 的问题 - hzalan的专栏 - CSDNBlog
- 关于java.lang.reflect.Field 和 java.lang.reflect.Method 的问题
- JAVA反射系列之Method,java.lang.reflect.Method的使用
- JAVA反射系列之Method,java.lang.reflect.Method的使用
- JAVA反射系列之Method,java.lang.reflect.Method的使用
- java.lang.reflect.Field
- Java.lang.reflect.Method invoke方法 实例
- Java.lang.reflect.Method invoke方法 实例
- Java.lang.reflect.Method invoke方法 实例
- java的反射(java.lang.Class 、java.lang.reflect )
- java.lang.reflect.Method
- JAVA学习之反射(1):Class类和java.lang.reflect包的使用
- java.lang.reflect 类 Method
- JAVA菜鸟入门(13) outer class与inner class的之间能互相使用field或者method吗?
- JAVA反射系列之Field,java.lang.reflect.Field使用获取方法。
- JAVA反射系列之Field,java.lang.reflect.Field使用获取方法。
- JAVA反射系列之Field,java.lang.reflect.Field使用获取方法。
- vsftp上传文件权限问题
- SQL基础第六章创建自己的表
- python学习之对象的创建
- iOS Provisioning Profile(Certificate)与Code Signing详解
- Intellij Idea14配置GitHub
- Java.lang.reflect 下的Class,Method,Field的使用实例
- printf()的标志
- 明天启程去15PB......
- 读书笔记之《设计原本》
- AsyncTask异步实现文件下载
- 本地管理表空间LMT&自动段空间管理ASSM
- iOS开发——keychain的使用
- SQL基础第九章行函数
- Android开源项目分类汇总