Java 反射编程(上)
文章目录
反射的泛型就是用?
来描述
反射与类的操作 (取得父类信息)
利用反射可以做出一个对象所具备的所有操作行为, 而且最关键的是这一切的操作都可以基于Object类型进行.
取得父类信息
在Java 里面任何的程序类实际上都要求一定会有一个父类, 在 Class类里面就可以通过此方式来取得父类或者是实现的父接口, 有如下的俩个方法提供:
1. 获得本类的包名称:
public Package getPackage()
- 1
2. 取得父类的Class 对象
public Class<? super T> getSuperclass()
- 1
3. 取得父类接口
public Class<?>[] getInterfaces()
- 1
通过反射可以取得类结构上的所有关键信息
案例: 使用上述方法
package com.record;
interface IMessage{
}
interface IFruit{
}
class Person implements IFruit,IMessage{
public void print() {
}
}
public class TestDemo {
public static void main(String[] args) {
// 方式一
Person person = new Person();
person.print();
//反射实现
Class<?> cls = Person.class;
System.out.println(cls.getName()); // 获得本对象所属的全类名
System.out.println(cls.getPackage().getName()); // 获得本类的包名称
System.out.println(cls.getSuperclass().getName()); // 获得父类的Class对象
Class<?> itf [] = cls.getInterfaces(); // 获得父类所有接口
for (int x = 0; x < itf.length; x++) {
System.out.println(itf[x].getName());
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
反射与类的操作 (反射调用构造)
反射调用构造
一个类中可以存在多个构造方法, 那么如果要想取得类中构造的调用, 就可以使用 Class 类提供的两个方法
1. 取得指定参数类型的构造
public Constructor<T> getConstructor(Class<?>... parameterTypes)
throws NoSuchMethodException,
SecurityException
- 1
- 2
- 3
2. 取得类中的所有构造
public Constructor<?>[] getConstructors()
throws SecurityException
- 1
- 2
以上两个方法返回的都是 java.lang.reflect.Constructor<T>
类的实例化对象, 这个类里面要重点关注一个方法:
实例化对象:
public T newInstance(Object... initargs)
throws InstantiationException,
IllegalAccessException,
IllegalArgumentException,
InvocationTargetException
- 1
- 2
- 3
- 4
- 5
案例: 取得类中的所有构造方法信息.
package com.record;
import java.lang.reflect.Constructor;
class Person{
public Person() {}
public Person(String name) {}
public Person(String name, int age) {}
}
public class TestDemo {
public static void main(String[] args) throws Exception{
Class<?> cls = Person.class;
Constructor<?> conts[] = cls.getConstructors();
for (int x = 0; x < conts.length; x++) {
System.out.println(conts[x].toString());
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
以上操作是直接利用了 Constructor 类中的 toString () 方法 取得构造方法的完整信息, 而如果只是使用 getName() 方法
就会比较麻烦了.
所以, getName() 只能取出 方法的名称.
改进: 使用getName() 方法取得构造方法完整信息
使用方法一: 获得修饰符的信息 (依然是 java.lang.reflect.Constructor<T> 类中
)
public int getModifiers()
- 1
结合 Modifier 类中的 toString() 方法实现
public static String toString(int mod)
- 1
使用方法二 : 获得方法中的详细参数信息
public Class<?>[] getParameterTypes()
- 1
使用方法三 : 获得方法中的异常抛出信息
public Class<?>[] getExceptionTypes()
- 1
案例实现: 自己拼凑构造方法
package com.record;
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
class Person{
public Person() throws Exception {}
public Person(String name) throws RuntimeException,Exception {}
public Person(String name, int age) throws Exception {}
}
public class TestDemo {
public static void main(String[] args) throws Exception{
Class<?> cls = Person.class;
Constructor<?> conts[] = cls.getConstructors();
for (int x = 0; x < conts.length; x++) {
System.out.print(Modifier.toString(conts[x].getModifiers())+" ");
System.out.print(conts[x].getName()+"(");
Class<?> params [] = conts[x].getParameterTypes();
for (int y = 0; y < params.length; y++) {
System.out.print(params[y].getName());
if (y< params.length -1) {
System.out.print(",");
}
}
System.out.print(")");
Class<?> exps [] = conts[x].getExceptionTypes();
if (exps.length > 0) { // 表示有异常
System.out.print(" throws ");
for (int i = 0; i < exps.length; i++) {
System.out.print(exps[i].getName());
if (i<exps.length -1) {
System.out.print(",");
}
}
System.out.println();
}
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
重点:
要理解为什么在定义简单 java 类的时候一定要保留有一个无参构造
案例: 观察 Class 实例化对象的问题
package com.record;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
public class TestDemo {
public static void main(String[] args) throws Exception {
Class<?> cls = Person.class;
System.out.println(cls.newInstance());
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
Class 类通过反射实例化对象的时候, 只能够调用类中的无参构造, 那么如果类中没有无参构造, 无法使用 Class类操作, 只能通过明确的构造调用执行实例化处理
案例: 要通过 Constructor 类实例化对象
package com.record;
import java.lang.reflect.Constructor;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
public class TestDemo {
public static void main(String[] args) throws Exception {
Class<?> cls = Person.class;
// 在明确表示取得指定参数类型的构造方法对象
Constructor<?> cont = cls.getConstructor(String.class, int.class);
System.out.println(cont.newInstance("张三",15));
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
原文章:https://blog.csdn.net/Beyond_Nothing/article/details/112058389
Java 反射编程(上)的更多相关文章
- java安全编程
java安全程序实际上是一个点稍微防御性编程意味着内,竟java作为编程语言,较C,c++,本身被认为是比较安全的,随着C,C++这样的偏底层的编程语言比,java少了显示的指针调用.少了程序上的内存 ...
- java基础知识(十一)java反射机制(上)
java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...
- Java面向对象 网络编程 上
Java面向对象 网络编程 上 知识概要: (1)网络模型 (2)网络通讯要素 (3)UDP TCP 概念 (4)Socket (5)UDP TCP 传输 ...
- java反射之获取所有方法及其注解(包括实现的接口上的注解),获取各种标识符备忘
java反射之获取类或接口上的所有方法及其注解(包括实现的接口上的注解) /** * 获取类或接口上的所有方法及方法上的注解(包括方法实现上的注解以及接口上的注解),最完整的工具类,没有现成的工具类 ...
- 第78节:Java中的网络编程(上)
第78节:Java中的网络编程(上) 前言 网络编程涉及ip,端口,协议,tcp和udp的了解,和对socket通信的网络细节. 网络编程 OSI开放系统互连 网络编程指IO加网络 TCP/IP模型: ...
- 用java网络编程中的TCP方式上传文本文件及出现的小问题
自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文 ...
- 11.Java反射机制 哦对了,前面的序号来自随笔关于编程之路的思索第一篇
基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象的方法的功能来自于J ...
- java 网络编程(五)Socket多线程上传文件
客户端: package cn.sasa.socketUploadFileDemo; import java.io.FileInputStream; import java.io.IOExceptio ...
- Java 反射机制详解(上)
一.什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java ...
随机推荐
- Intel汇编语言程序设计学习-第二章 IA-32处理器体系结构-下
2.2 IA-32处理器体系结构 如前所述,IA-32是指始于Intel386直到当前最新的奔腾4的系列的处理器(额...这本书是什么时候写的啊,表示现在应该是I7啊),在IA-32的发展过程中,I ...
- Andrew Ng机器学习算法入门(十):过拟合问题解决方法
在使用机器学习对训练数据进行学习和分类的时候,会出现欠拟合和过拟合的问题.那么什么是欠拟合和过拟合问题呢?
- 从零开始搞监控系统(1)——SDK
目前市面上有许多成熟的前端监控系统,但我们没有选择成品,而是自己动手研发.这里面包括多个原因: 填补H5日志的空白 节约公司费用支出 可灵活地根据业务自定义监控 回溯时间能更长久 反哺运营和产品,从而 ...
- Unittest框架之测试套件:TestSuite
前言 使用了unittest.main()方法执行当前模块里的测试用例. 除此之外,Unittest还可以通过测试套件构造测试用例集,再执行测试用例 将测试用例添加至TestSuite(测试套件) 方 ...
- OO随笔之纠结的第二单元——多线程电梯
综述 主要任务就是写一个电梯模拟器,读入每一个人的请求然后让电梯把他们送到想去的地方. 从第一次到第三次作业,三次的主要任务都是相同的,但是每次都增加了很多的细节,每次的难度都逐步增长,电梯复杂度和瞎 ...
- [bug] Flask css 不更新
参考 https://blog.csdn.net/weixin_30454481/article/details/97108510
- 网络安全服务(Network Security Services, NSS
网络安全服务(Network Security Services, NSS)是一套为网络安全服务而设计的库 支持支持安全的客户端和 服务器应用程序.使用NSS构建的应用程序可以支持SSL v2 和v3 ...
- IT菜鸟之BIOS和VT
一.虚拟化:VT(Virtualization Technology) 二.BIOS (basic input output system基本输入输出系统) 主板优先启动--bios启动--bios开 ...
- 小程序webview涉及的支付能力、选用绑定多商户支付
小程序webview涉及的支付能力.选用绑定多商户支付 webview承接页面涉及的支付能力: 仅支持小程序本身支付能力,不支持承接页面内的原支付功能(譬如,webview中嵌入了h5官方商城,经过配 ...
- 使用 Flux+Flagger+Istio+Kubernetes 实战 GitOps 云原生渐进式(金丝雀)交付
在这篇指南中,你将获得使用 Kubernetes 和 Istio 使用 GitOps 进行渐进式交付(Progressive Delivery)的实际经验. 介绍 gitops-istio GitOp ...