廖雪峰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使用方式 ...
随机推荐
- centos6.8 搭建zabbix被监控端
System:Centos 6.8 Zabbix-agent:3.2.1 1 安装对应版本的zabbix的yum源,官方网站中没有找到zabbix3.0支持的centos6的源,所以用的3.2 #rp ...
- python基础-函数基本特性和用法
函数: 初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因变量,y是x的函数.自变量x的取值 ...
- java 调用process
java调用process 有两种实现方法,一是使用Runtime类,二是使用Process类. 我在最近的项目里用的是Runtime类,接下来写下总结. 有图有真相(在网上学来一句话) packag ...
- ios-密码加密
加密文件可到网上搜索MyMD5后下载 MyMD5.h文件 // // MyMD5.h // GoodLectures // // Created by yangshangqing on 11-10-1 ...
- goreleaser 方便的go 二进制包分发工具
goreleaser 可以帮助我们进行go 二进制包的快速,简单分发,我们可以用来创建一个github release 以及发布到homwbrew formula . 安装 mac 系统,实际根据自己 ...
- 随机重拍与抽样(random_shuffle,random_sample,random_sample_n)
//版本一:使用内部的随机数生成器 template<class RandomAccessIterator> void random_shuffle( RandomAccessIterat ...
- redis之 Redis持久化配置
Redis持久化配置 Redis的持久化有2种方式 1快照 2是日志 Rdb快照的配置选项 save 900 1 // 900内,有1条写入,则产生快照 save 300 1000 ...
- 朴素贝叶斯文本分类(python代码实现)
朴素贝叶斯(naive bayes)法是基于贝叶斯定理与特征条件独立假设的分类方法. 优点:在数据较少的情况下仍然有效,可以处理多分类问题. 缺点:对入输入数据的准备方式较为敏感. 使用数据类型:标称 ...
- jmeter ---监控服务器CPU, 内存,网络数据
JMeter如何收集获得服务器cpu,内存,磁盘,网络等相关资源使用率的信息 1. JMeter 自带的Monitor Results 监控 JMeter 自带的Monitor Results 在官网 ...
- 弄清SDI显示工程中的每一个信号,每一个逻辑
弄清SDI显示工程中的每一个信号,每一个逻辑 1. FIFO外部逻辑控制 FIFO的读和写在不同的时钟域,所以读和写的控制逻辑应当分开写在不同的两个always块语句中. 2.播出端复位信号的产生 : ...