java反射获取构造器以及调用构造器创建对象
来源:互联网 发布:篮球鞋 知乎 编辑:程序博客网 时间:2024/05/17 07:47
Java反射获取构造器
获取某一个类中的所有构造器:
1. 明确操作的是哪一个类(严格的说是类编译后的字节码)
2. 获取构造器
Constructor类:表示类中构造器的类型,Constructor实例表示的就是某一个类中的某一个构造器
Class类中的:
public Constructor<?>[] getConstructors();//该方法只能获取当前Class所表示的类的public构造器——?表示通配符,即可以匹配所有类型, 其指当前构造器所在的类(字节码)
Eg:
class User
{
private User(){ }
public User(String name){.....}
public User(String name, int age){...}
}
Class<User> clz=User.class;//也可写为 Class<?> clz=User.class;或者Class clz=User.class;
Constructor[] cs=clz.getConstructors();//也可写为Constructor<?>[] cs=clz.getConstructors();——?表示通配符,即可以匹配所有类型, 其指当前构造器所在的类(字节码)
public Constructor<?>[] getDeclaredConstructors();//该方法获取当前Class所表示的类的所有构造器(包括public、protected、private修饰的,即与访问权限无关)——返回的顺序任意
获取某一个类中指定的一个构造器:
1. 明确操作的是哪一个类(严格的说是类编译后的字节码)
2. 获取构造器
Class clz=User.class;
应该告诉程序想要获取的是具有什么形参列表的构造器
Class类中的: public Constructor<T> getConstructor(Class<?>... parameterTyoes);//parameterTyoes表示构造器参数的Class类型——注意使用的是可变参数方式——该方法只能获取当前Class所表示的类中指定的一个public修饰的构造器
Constructor cs1=clz.getConstructor(String.class);
Constructor cs2=clz.getConstructor(String.class,int.class);
public Constructor<T> getDeclardConstructor(Class<?>... parameterTyoes);//该方法获取当前Class所表示的类中指定的一个构造器(public、protected、private,即与访问权限无关)
调用构造器,创建对象
1. 先找到被调用构造器所在的类的字节码
2. 找到被调用的指定的构造器
3. 执行该构造器
Eg:
class User
{
public User(){ }
public User(String name){.....}
private User(String name, int age){...}
}
需求:调用User()构造器
Class<User> clz=User.class;//Class clz=User.class;或Class<?> clz=User.class;
Constructor<User> c=clz.getConstructor();
Constructor类中有一个方法:public T newInstance(Object... initargs);——返回:T为当前构造器所在的类类型;参数:initargs,,表示构造器的实际参数
User user=c.newInstance();
//Constructor c=clz.getConstructor();没有指明具体泛型,则类型丢失,只能使用Object user=c.newInstance();——要调用对应类所具有的属性和方法,需要进行强制类型转换,否则编译时,在Object中检查该方法或属性,没有找到,会报编译错误。
如果一个类中的构造器可以直接访问,同时没有参数,那么可以直接使用Class类中的public Object newInstance()创建对象
User user=clz.newInstance();
需求:调用带参数的构造器
Class<User> clz=User.class;//Class clz=User.class;或Class<?> clz=User.class;
Constructor<User> c=clz.getConstructor(String.class);
User user=c.newInstance(“limi”);
需求:调用私有的构造器
Class<User> clz=User.class;//Class clz=User.class;或Class<?> clz=User.class;
Constructor<User> c=clz.getDeclardConstructor(String.class,int.class);
User user=c.newInstance(“limi”, 17);//会出现IllegalAccessException异常,不能直接访问private修饰的成员
为了安全性考虑,private成员外界不准访问
但是,一定要访问:此时就要告诉程序在运行期间忽略掉该安全检查
AccessibleObject类——可访问类
Constructor,Field,Method类都继承于该类
AccessibleObject类中有一个方法:public void setAccessible(boolean flag);——设置是否可访问,即使是私有的,true表示可访问
又因为Constructor,Field,Method类都继承于该类,故Constructor类具有该方法
解决上述问题:
Class<User> clz=User.class;//Class clz=User.class;或Class<?> clz=User.class;
Constructor<User> c=clz.getDeclardConstructor(String.class,int.class);
c.setAccessible(true);
User user=c.newInstance(“limi”, 17);
- java反射获取构造器以及调用构造器创建对象
- Java反射——获取构造器以及创建对象
- Java反射创建对象-自适应构造器
- 反射:使用反射调用构造器创建对象
- 反射获取构造器对象
- 反射--获取和调用构造器
- 反射获取构造方法并创建对象
- Java反射获取属性、方法、构造器
- 反射第三步 : 通过反射获取某一个类的 构造器Constructor 并通过反射创建对象
- 构造器创建对象
- 利用反射调用带参数的构造函数创建对象
- 关于java 反射 创建对象 调用 有参数 的 构造函数
- Java通过反射机制使用非默认构造器创建对象
- java反射(3)获取Class对象属性方法和构造器
- 如何使用Java的反射机制以及调用构造方法?
- Java:反射构造的调用
- java反射调用配置文件构造类对象,使用其方法
- java反射调用配置文件构造类对象,使用其方法
- 使用PHP搭建WebService服务器
- 编译go源代码碰到找不到pkt的问题
- sqlserver导入oracle数据第一步
- sublime text3 添加插件
- C语言练习——念整数
- java反射获取构造器以及调用构造器创建对象
- ORACLE分级查询
- A*搜索算法
- spring boot初玩(jdbc,logback,mysql,dubbo)
- How Bayesian inference works
- 分布式服务之Dubbo_01_基础框架搭建
- C++ count和count_if的使用
- 浏览器对象模型BOM之window对象
- AndroidAnnotations配置使用