廖雪峰Java4反射与泛型-1反射-4调用构造方法
1.Class.newInstance()只能调用public的无参数构造方法
public class Main {
public static void main(String[] args) throws InstantiationException,IllegalAccessException{
String s = (String) String.class.newInstance();
Integer n = (Integer) Integer.class.newInstance();//Interger没有无参数的public构造方法会提示实例化失败
}
}
2.调用带参数的Constructor
Constructor对象包含一个构造方法的所有信息,可以用它来创建一个实例。
如Integer有2个构造方法,1个传入数字,1个传入字符串
Main.java
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
public class Main {
public static void main(String[] args) throws InvocationTargetException,InstantiationException, IllegalAccessException, NoSuchMethodException {
Integer n1 = new Integer(123);
Integer n2 = new Integer("123");
System.out.println("n1:"+n1+"\t"+"n2:"+n2);
Class cls = Integer.class;
Constructor cons1 = cls.getConstructor(int.class);
Integer n3 = (Integer) cons1.newInstance(123);
Constructor cons2 = cls.getConstructor(String.class);
Integer n4 = (Integer) cons2.newInstance("123");
System.out.println("n3:"+n3+"\t"+"n4:"+n4);
}
}
3.通过Class实例获取Constructor信息
- getConstructor(Class...):获取某个public的Constructor
- getDeclaredConstructor(Class...):获取某个Constructor,包括非public的
- getConstuctors():获取所有public的Constructor
- getDeclaredConstructors():获取所有的Constructor,包括非public的。
Constructor总是当前类的构造方法,和继承没有关系,因此也不可能获得父类的Constructor
通过Constructor实例可以创建一个实例对象
- newInstance(Object...parameters)
Hello.java
public interface Hello {
public void hello();
}
Student.java
public class Student implements Hello{
public static int number = 0;
public String name ;
private int age;
public Student(){
this("unNamed");
}
public Student(String name){
this(name,20);
}
private Student(String name,int age){
this.name=name;
this.age = age;
number++;
}
public void hello(){
System.out.println(name+" is Student");
}
}
Main.java
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws InvocationTargetException,InstantiationException, IllegalAccessException, NoSuchMethodException {
Class cls = Student.class;
Constructor con1 = cls.getDeclaredConstructor(String.class,int.class);//传入参数类型
printConstructor(con1);
con1.setAccessible(true);//允许访问这个构造方法
Student s = (Student) con1.newInstance("小明",12);
s.hello();
}
static void printConstructor(Constructor c){
System.out.println(c);//打印构造方法
System.out.println("parameters: "+Arrays.toString(c.getParameterTypes()));//打印参数类型
System.out.println("modifier:"+c.getModifiers());//打印传入参数个数
}
}
4.SecurityManager
通过设置setAccessible(true)来访问非public构造方法
serAccessible(true)可能会失败:
- 定义了SecurityManager
- SecurityManager的规则阻止对该Constructor设置accessible:例如,规则应用与所有Java和Javax开头的package的类
5.总结
- Constructor对象封装了构造方法的所有信息
- 通过Class实例的方法可以获取Constructor实例:getConstructor()/getDeclaredConstructor()/getConstuctors()/getDeclaredConstructors()
- 通过Constructor实例可以创建一个实例对象:newInstance(Object...parameters)
- 通过设置setAccessible(true)来访问非public构造方法
廖雪峰Java4反射与泛型-1反射-4调用构造方法的更多相关文章
- 廖雪峰Java4反射与泛型-3泛型-7泛型和反射
1.部分反射API是泛型 1.1获取反射API的泛型 部分反射API是泛型,如Class<T>是泛型 //如果使用Class,不带泛型,出现compile warning编译警告 Clas ...
- 廖雪峰Java4反射与泛型-3范型-4擦拭法
1.擦拭法是Java泛型的实现方式. 编译器把类型视为Object. * 泛型代码编译的时候,编译器实际上把所有的泛型类型T统一视为Object类型.换句话说,虚拟机对泛型一无所知,所有的工作都是编译 ...
- 廖雪峰Java4反射与泛型-2注解-3处理注解
1.处理注解 注解本身对对代码逻辑没有任何影响 SOURCE类型的注解在编译期就被丢掉了 CLASS类型的注解仅保存在class文件中 RUNTIME类型的注解在运行期可以被读取 如何使用注解由工具决 ...
- 廖雪峰Java4反射与泛型-1反射-2访问字段Field和3调用方法Method
2.字段Field 2.1.通过Class实例获取字段field信息: getField(name): 获取某个public的field,包括父类 getDeclaredField(name): 获取 ...
- 廖雪峰Java4反射与泛型-1反射-1Class类
1.Class类与反射定义 Class类本身是一种数据类型(Type),class/interface的数据类型是Class,JVM为每个加载的class创建了唯一的Class实例. Class实例包 ...
- 廖雪峰Java4反射与泛型-3范型-6super通配符
1.super通配符 1.1super通配符第一种用法 泛型的继承关系 Pair<Integer>不是Pair<Number>的子类,如 static void set(Pai ...
- 廖雪峰Java4反射与泛型-3范型-5extends通配符
1.泛型的继承关系: Pair<Integer>不是Pair<Number>的子类 add()不接受Pair<Integer> Pair.java package ...
- 廖雪峰Java4反射与泛型-3范型-3编写泛型
编写泛型类比普通的类要麻烦,而且很少编写泛型类. 1.编写一个泛型类: 按照某种类型(例如String)编写类 标记所有的特定类型例如String 把特定类型替换为T,并申明 Pair.java pa ...
- 廖雪峰Java4反射与范型-3范型-1什么是泛型
1.为什么需要泛型? JDK提供了ArrayList,可以看作"可变长度"的数组: 比数组使用方便 示例1:如果使用ArrayList存储String类型: 需要强制转型 不方便, ...
- 廖雪峰Java4反射与泛型-2注解-2定义注解
1.定义注解 使用@interface定义注解Annotation 注解的参数类似无参数方法 可以设定一个默认值(推荐) 把最常用的参数命名为value(推荐) 2.元注解 2.1Target使用方式 ...
随机推荐
- 04 jsp,EL,JSTL
jsp:Java Server Page 什么是jsp?从用户角度看待 ,就是是一个网页 , 从程序员角度看待 , 其实是一个java类, 它继承了servlet,所以可以直接说jsp 就是一个Se ...
- 有关vuex的问题
在引入mapMutations时报错,解决方法: 1:npm install --save-dev babel-plugin-transform-object-rest-spread 2:在packa ...
- struts2(三)拦截器
拦截器 需求 如果要访问某一个action类中的某一个方法的内容,如果是admin用户,则访问,如果不是admin用户,则不能访问. 实现 缺点 权限判断的代码和业务逻辑代码混合在一起了 利用拦截器 ...
- S老师 Top-Down RPG Starter Kit 学习
character creation using UnityEngine; using System.Collections; public class CharacterCreation : Mon ...
- LoadRunner参数化&关联
我们用 HTTP 协议做脚本,要注意的是,不同协议的函数是不一样的,假如换 websocket 协议,关联函数就要用其他的 参数化 原理 1.什么叫参数化 把脚本内一个写死的值,去一个数组内取值,进行 ...
- HappytimeOnvif Client V8.3的使用
1.system-->system settings-->勾选RTP RTSP 2.start video poll
- buntu下备份系统的方法
今天不小心强行结束了一不知道用处的进程,结果造成进不了x界面,gdm启动不了,使用apt-get进行修复,结果几乎要把整个x界面有关的软件包删除,所以只好重装系统,为了防止下次出现类似的问题,所以把系 ...
- antd 知识点
表格实现:不管多少列,为列指定一个宽度,让表格在容器里可左右拖动 例子文件地址:https://github.com/cag2050/antd_mobx_demo/blob/master/src/co ...
- malloc的使用、用malloc动态分配内存以适应用户的需求的源代码实例
int len; ; printf("please enter the size that you want: "); scanf("%d", &len ...
- kolla-ansible部署多节点OpenStack-Pike
一.准备工作: 系统:均为centos 7.5 这里以笔记本一台.vmware workstation做为实验环境 建议虚拟机硬盘存储为单个文件,因为在上传和使用windows镜像时文件太大容易造成虚 ...