Java Reflection-Constructors
来源:互联网 发布:json格式日志 编辑:程序博客网 时间:2024/05/17 21:50
原文链接:http://tutorials.jenkov.com/java-reflection/constructors.html
我们可以通过 Java 的 java.lang.reflect.Constructor 来观察 classes 的所有构造方法,也可以在程序运行时来实例化一个对象。本文将会带领大家了解有关 Java Constructor 对象的细节。
下面的这个 User 类是我用来进行代码演示的,一个简单的 Java Bean :
package test;import java.lang.reflect.Constructor;public class User { private String userName; private String password; private int age; private User() { } User(int age) { this.age = age; } public User(String userName) { this.userName = userName; } pprotected User(String userName, String password) { this.userName = userName; this.password = password; } public User(String userName, String password, int age) { this.userName = userName; this.password = password; this.age = age; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }}
Obtaining Constructor Objects
可以通过 Class 对象累获取 Constructor ,下面是一个例子:在 class 中所声明的每一个 public 构造方法都会在 Constructor[] 数组中有一个实例。
String className = "test.User"; Class aClass = Class.forName(className); Constructor[] constructors = aClass.getConstructors();注意:只能获得 public 的构造方法, private 、 protected 、包访问权限(就是不加修饰符的构造方法)的构造方法是得不到的。
如果能明确的知道我们想要访问的那个构造方法的参数类型,我们就可以用下面的方式来获取到这个构造方法,而不是通过获取到所有的构造方法数组。这个例子返回了一个给定类的只有一个 String 类型参数的 public 构造方法:
Constructor constructorWithStringParam = aClass.getConstructor(new Class[] {String.class});
如果根据给定的参数找不到与之匹配的构造方法,比如说在上面的例子中,如果没有一个 public 的参数类型是 String 的构造方法,就会抛出一个 NoSuchMethodException 。
注意:在 new Class[] {} 时一定要注意参数的类型和顺序,如果 new Class[] {int.class, String.class, String.class} 这样就会抛出一个 java.lang.NoSuchMethodException因为我们并没有定义一个这样的构造方法:public User(int param1, String param2, String param3) 。
决定一个方法有两个因素:
1、方法名称
2、方法的参数
方法的参数又有三个要素:
1、参数的数量
2、参数的类型
3、参数的顺序
Constructor Parameters
我们可以像这样来读取一个构造方法的参数类型:
Constructor constructor; // 以某种方式得到了一个 Constructor 的对象 Class[] parameterClasses = constructor.getParameterTypes();下面的代码可以循环的获得一个 class 的所有 public 的构造方法的所有 参数类型:
String className = "test.User"; Class aClass = Class.forName(className); Constructor[] constructors = aClass.getConstructors(); for (Constructor constructor : constructors) { System.out.println(constructor.getName()); Class[] parameterClasses = constructor.getParameterTypes(); if (parameterClasses != null && parameterClasses.length != 0) { for (Class paramClass : parameterClasses) { System.out.println("param type:" + paramClass.getSimpleName()); } } }
Instantiating Objects using Constructor Object
我们可以像这样来实例化一个 User 对象:
Object object = constructor.newInstance("test parameter");
其实在这里我们通过调用的其实是下面的这个构造方法来 new 了一个对象:
public User(String userName) { this.userName = userName;}
Constructor.newInstance() 方法有一个变长数量的参数(可以没有参数,也可以有多个参数),但是我们必须精确地(包括参数的数量、类型、顺序)提供我们想要调用的构造方法的参数。
0 0
- Java Reflection-Constructors
- Java Reflection - Constructors
- Java Reflection Tutorial for Classes, Methods, Fields, Constructors, Annotations and much more
- Java - Constructors and Polymorphism
- Java Reflection
- Java Reflection
- Java Reflection
- Java Reflection
- java Reflection
- Java Reflection
- java reflection
- Java Reflection
- java reflection
- Java reflection
- Java Reflection
- java reflection
- JAVA Reflection
- JAVA Reflection
- 为什么不收录???天理何在?
- Android安全——签名机制
- 动态域名更新脚本
- Servlet的生命周期及工作原理
- 黑马程序员---集合II--
- Java Reflection-Constructors
- 苹果等美企巨头秘建技术联盟 弃用IBM仍存安全隐患
- python 的日志logging模块学习
- 【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)
- 二分图判定
- poj 2506 Tiling——递推和大数模拟
- 面向对象为什么要多用对象模式而少用继承模式?
- Java学习总结2——操作符注意点总结
- ORACLE EXPDP命令使用详细