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 ...
随机推荐
- 【python】Leetcode每日一题-最长公共子序列
[python]Leetcode每日一题-最长公共子序列 [题目描述] 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度.如果不存在 公共子序列 ,返回 0 . ...
- 混部之殇-论云原生资源隔离技术之CPU隔离(一)
作者 蒋彪,腾讯云高级工程师,10+年专注于操作系统相关技术,Linux内核资深发烧友.目前负责腾讯云原生OS的研发,以及OS/虚拟化的性能优化工作. 导语 混部,通常指在离线混部(也有离在线混部之说 ...
- Unity动态构建mesh绘制多边形算法流程分析和实践
前言 先说一下,写这篇博文的动机,原文的博主代码写的十分潇洒,以至于代码说明和注释都没有,最近恰逢看到,所以以此博文来分析其中的算法和流程 参考博文:https://blog.csdn.net/lin ...
- Codeforces Round #661 (Div. 3)
A. Remove Smallest 题意:数组是否满足任意i,j保证|ai-aj|<=1,如果都可以满足,输出YES,否则输出NO 思路:直接排序遍历即可 代码: 1 #include< ...
- Linux(深度)系统安装富士施乐(网络)打印机
一般来讲,linux系统识别打印机没有问题,重点难点在于后面设置.此文特别感谢:河北石龙的陈一繁销售代表.P288dw施乐官网并未提供Linux的驱动并在安装过程中遇到很多问题,其不厌其烦的为我联系厂 ...
- [bug] vue cli 部署在 springboot中报404
复制资源时,在static目录下新建了一个static目录,估计是引起了spring解析的混乱,改为one后即可正常访问 参考 https://www.cnblogs.com/qianjinyan/p ...
- CSS中的颜色、长度、角度、时间
一.颜色的表示方法 颜色是通过对红.绿和蓝光的组合来显示的. 1.颜色名 1 <!DOCTYPE html> 2 <html lang="en"> 3 &l ...
- Docker镜像的仓库及底层依赖的核心技术(3)
一.docker镜像的仓库 仓库分为公共仓库和私有仓库 DockerHub的官方仓库:https://hub.docker.com DockerPool社区仓库:https://dl.dockerpo ...
- IDEA 怎么统计项目代码行数
引言 IDEA 统计项目代码行数,主要是使用 Statistic 插件来统计 第一步 点击 File->Settings,如下图所示: 第二步 点击 install 安装 Statistic 插 ...
- C#中的数据结构
Array 连续性的内存空间 快速定位查找元素,随机访问性强,查找效率高 已知的统一的元素类型,减小运行时开销 固定长度,不能再新增元素 ArrayList 连续性的内存空间 快速定位查找元素,随机访 ...