【java编程】java反射之基础
来源:互联网 发布:单片机公司有哪些 编辑:程序博客网 时间:2024/05/29 16:22
反射就是将java中的各种成分映射成相应的java类。我们把javaAPI里的所有类都抽象出来,就得到了构造方法(Constructor),成员变量(Field),成员函数(Method).反射的基石
反射的前提是得到字节码,每一种数据类型都对应着一份字节码,当new对象时,都是在对这份字节码的复制。比如:String类型对应的字节码就是String.class。获得字节码的三种获取方式
1.通过java类来获取
类名.class 例:int[].class;
2.通过对象来获取
对象.getClass() 例:String str="123";str.getClass();
3.通过类名称来获取(通常是相应的类或者对象都没有被加载到内存)
Class.forName(类名称); 例:Class.forName("java.util.Date");构造函数的反射(Constructor)
1.先得到相应的字节码
Class cls=string.lass();
2.通过字节码来获取构造函数,这里可以指定参数。
Constructor con=cls.getConstructor(StringBuffer.class);//这里的参数代表传入构造函数的参数类型
3.通过构造函数来创建实例
con.newInstance(new StringBuffer("abc"));//这里的参数是传入到构造函数的参数值
总结:这里反射实现的等同于String str=new String(new StringBuffer("abc"));
成员变量的反射(Field)
1.先得到相应的字节码
reflectPoint rPoint=new reflectPoint(3, 5);
Class pointClass=reflectPoint.class;2.通过字节码指定要获取的哪个成员变量,返回Field对象的类成员变量Fieldx,并通过Field对象获取相应对象的此成员变量的值
Field Fieldx=pointClass.getField("x");
int x=(int)Fieldx.get(rPoint);3.如果指定对象的成员变量为私有,如y,要使用暴力反射来得到相应的值
Field Fieldy=pointClass.getDeclaredField("y"); //先获取Field对应的类成员变量 ,使用getDeclaredField方法
Fieldy.setAccessible(true); //再设置field类成员变量的权限为可访问
int y=Fieldy.getInt(rPoint); //使用类成员变量得到相应的对象的该成员变量的值
package reflect;public class reflectPoint {public int x;private int y;public String str1="wangcong";public String str2="wanghuan";public reflectPoint(int x, int y) {super();this.x = x;this.y = y;}@Overridepublic String toString(){return str1+":"+str2;}}
成员方法的反射Method
1.先得到字节码
String str="abc";
Class cls=str.getClass();
2.通过字节码得到类成员方法
Method charAtMethod=cls.getMethod("charAt",int.class);//这里的chatAt是String的方法,int.class是chatAt的参数类型。如chatAt(1);
3.用类成员方法去调用对象,以及传值
charAtMethod.invoke(str,1);//str是String的对象,1代表charAt的参数charAt(1);
下面的例子是用方法反射来调用main方法
import java.lang.reflect.*;class MethodDemo{public static void main(String[] args) throws Exception{//在运行的时候传入类名String str=args[0];System.out.println(str);Method startingClassMethod=Class.forName(str).getMethod("main", String[].class);startingClassMethod.invoke(null, (Object)new String[]{"111","222","333"});}}class testArguments{public static void main(String[] args){for(String arg:args){System.out.println(arg);}}}
下面的小例子是用反射的方法去创建集合对象
import java.io.FileInputStream;import java.io.InputStream;import java.util.Collection;import java.util.Properties;public class HashSetDemo {/** * @param args */public static void main(String[] args) throws Exception {InputStream inputStream=new FileInputStream("E:\\Android\\WorkSpace\\StudyJava\\src\\reflect\\conn.Properties");Properties properties=new Properties();properties.load(inputStream);inputStream.close();String ClassName=properties.getProperty("ClassName");System.out.println(ClassName);Collection collection=(Collection)Class.forName(ClassName).newInstance();reflectPoint rp1=new reflectPoint(3, 3);reflectPoint rp2=new reflectPoint(5, 5);reflectPoint rp3=new reflectPoint(3, 3);collection.add(rp1);collection.add(rp2);collection.add(rp3);System.out.println(collection.size());}}
conn.Properties的信息
ClassName=java.util.ArrayList
- 【java编程】java反射之基础
- java基础之Gui编程和反射
- java基础之Gui编程和反射
- Java编程基础-反射
- java基础之 反射
- java基础之反射
- JAVA基础之反射
- java基础之反射
- java基础之反射
- Java基础之反射
- Java基础之反射
- java基础之 反射
- Java基础之反射
- Java基础之反射
- java基础之反射
- java基础之反射
- java基础之----反射
- Java基础之-反射
- 29、简单的apk安装器
- (素材源码)猫猫学IOS(六)UI之iOS热门游戏_超级猜图
- #个人赛第五场解题总结#
- LeetCode OJ Search Insert Position
- LeetCode Remove Duplicates from Sorted Array
- 【java编程】java反射之基础
- FOJ有奖月赛-2015年03月
- 【DP|状态压缩+预处理】POJ-1185 炮兵阵地
- LeetCode OJ Swap Nodes in Pairs
- Java内部类详解
- 欢迎使用CSDN-markdown编辑器
- LeetCode OJ Multiply Strings
- 学习笔记-C/C++-结构体与sizeof,内存对齐的题目怎么做
- [转]OpenTSDB监控系统的研究和介绍