java反射
程序员文章站
2024-01-21 14:35:46
...
[list]
[*]Class类是实现java反射的基础
[/list]
Class类表示正在运行的java应用程序中的类和接口。Class只有私有的构造函数。Class类在加载类时由Java虚拟机以及调用类加载器中的defineClass方法自动创建的。只在内存中存在一份加载类的Class类。
三种方式得到某个Java类的Class类,以String为例:
String s = "";
Class cls1 = s.getClass();
Class cls2 = String.class;
Class cls3 = Class.forName("java.lang.String");
cls1 == cls2 //true
cls2 == cls3 //true
通过Class类可以取得Java类对象的Method、Interface、Constructor、Field、Package对象。
[list]
[*]反射就是把Java类中的各种成分映射成为相应的java类。
[/list]
[list]
[*]Constructor类代表类中的某个构造方法
[/list]
1 Class的getConstructors()得到类中所有的构造方法
2 getConstructor(Class... className)得到类中某个构造方法
在jdk1.5之前该方法的参数是一个数组Class[] classNames
比如String.class.getConstructor(StringBuffer.class);
3 创建对象实例
String.class.getConstructor(StringBuffer.class).newInstance(new StringBuffer("abc"));
//调用获得的方法时用2步骤创建的实例对象
Class类的newInstance()方法
例子:Class.forName("java.lang.String").newInstance();
1该方法内部先得到默认的构造方法,这也是为什么javaBean中要有一个空参数构造方法的原因,然后调用该构造方法创建实例对象。
2该方法内部实现用到了缓存机制来保存默认的构造方法的实例对象
[list]
[*]Field类代表类中的某个变量
[/list]
1取得该类所有的Field数组:
Point.class.getFields();//所有公有的字段
Point.class.getDeclaredFields();//所有在类声明的字段。
2取得该类的某个Field对象
Field fieldX = Point.class.getField("x");//x是共有字段,能直接用getField()方法取得
Field fieldY = Point.class.getDeclaredField("y");//y是private字段
3取得字段中的值
Point point = new Point("a","b");
fieldX.get(point) -->a
fieldY.get(point) -->报运行异常illegalAccessException 非法访问异常,要在该步前加入
fieldY.setAccessible(true) ---强制访问
[list]
[*]Method类代表类中的某个方法
[/list]
1.取得所有的方法
Methods[] method = String.class.getMethods();//取得所有的共有方法
Methods[] method = String.class.getDeclaredMethods();//取得所有类中声明的方法
2.取得某个方法
Method methodCharAt = String.class.getMethod("charAt",int.class);
同样有getDeclaredMethod;
3.通过反射调用方法
String str = "abc";
methodCharAt.invoke(str,1);
对于非公有的方法设置访问权限true setAccessible(flag)取得访问权限
4当调用类中的静态方法时,invoke的第一个参数可以为null
5当调用类的方法没有参数时候,参数列表可以为空
6调用的方法中中如果只有一个数组参数的时候,需要将该数组再包装一层Object数组中,或者将数组强制转换为Object
[*]Class类是实现java反射的基础
[/list]
Class类表示正在运行的java应用程序中的类和接口。Class只有私有的构造函数。Class类在加载类时由Java虚拟机以及调用类加载器中的defineClass方法自动创建的。只在内存中存在一份加载类的Class类。
三种方式得到某个Java类的Class类,以String为例:
String s = "";
Class cls1 = s.getClass();
Class cls2 = String.class;
Class cls3 = Class.forName("java.lang.String");
cls1 == cls2 //true
cls2 == cls3 //true
通过Class类可以取得Java类对象的Method、Interface、Constructor、Field、Package对象。
[list]
[*]反射就是把Java类中的各种成分映射成为相应的java类。
[/list]
[list]
[*]Constructor类代表类中的某个构造方法
[/list]
1 Class的getConstructors()得到类中所有的构造方法
2 getConstructor(Class... className)得到类中某个构造方法
在jdk1.5之前该方法的参数是一个数组Class[] classNames
比如String.class.getConstructor(StringBuffer.class);
3 创建对象实例
String.class.getConstructor(StringBuffer.class).newInstance(new StringBuffer("abc"));
//调用获得的方法时用2步骤创建的实例对象
Class类的newInstance()方法
例子:Class.forName("java.lang.String").newInstance();
1该方法内部先得到默认的构造方法,这也是为什么javaBean中要有一个空参数构造方法的原因,然后调用该构造方法创建实例对象。
2该方法内部实现用到了缓存机制来保存默认的构造方法的实例对象
[list]
[*]Field类代表类中的某个变量
[/list]
class Point
{
public String x;
private String y;
public Point(String x, String y) {
super();
this.x = x;
this.y = y;
}
}
1取得该类所有的Field数组:
Point.class.getFields();//所有公有的字段
Point.class.getDeclaredFields();//所有在类声明的字段。
2取得该类的某个Field对象
Field fieldX = Point.class.getField("x");//x是共有字段,能直接用getField()方法取得
Field fieldY = Point.class.getDeclaredField("y");//y是private字段
3取得字段中的值
Point point = new Point("a","b");
fieldX.get(point) -->a
fieldY.get(point) -->报运行异常illegalAccessException 非法访问异常,要在该步前加入
fieldY.setAccessible(true) ---强制访问
[list]
[*]Method类代表类中的某个方法
[/list]
1.取得所有的方法
Methods[] method = String.class.getMethods();//取得所有的共有方法
Methods[] method = String.class.getDeclaredMethods();//取得所有类中声明的方法
2.取得某个方法
Method methodCharAt = String.class.getMethod("charAt",int.class);
同样有getDeclaredMethod;
3.通过反射调用方法
String str = "abc";
methodCharAt.invoke(str,1);
对于非公有的方法设置访问权限true setAccessible(flag)取得访问权限
4当调用类中的静态方法时,invoke的第一个参数可以为null
5当调用类的方法没有参数时候,参数列表可以为空
6调用的方法中中如果只有一个数组参数的时候,需要将该数组再包装一层Object数组中,或者将数组强制转换为Object
上一篇: 设计模式-工厂模式