反射的泛型就是用?来描述

反射与类的操作 (取得父类信息)

利用反射可以做出一个对象所具备的所有操作行为, 而且最关键的是这一切的操作都可以基于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 反射编程(上)的更多相关文章

  1. java安全编程

    java安全程序实际上是一个点稍微防御性编程意味着内,竟java作为编程语言,较C,c++,本身被认为是比较安全的,随着C,C++这样的偏底层的编程语言比,java少了显示的指针调用.少了程序上的内存 ...

  2. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  3. Java面向对象 网络编程 上

     Java面向对象 网络编程 上 知识概要:                     (1)网络模型 (2)网络通讯要素 (3)UDP TCP 概念 (4)Socket (5)UDP TCP 传输 ...

  4. java反射之获取所有方法及其注解(包括实现的接口上的注解),获取各种标识符备忘

    java反射之获取类或接口上的所有方法及其注解(包括实现的接口上的注解) /** * 获取类或接口上的所有方法及方法上的注解(包括方法实现上的注解以及接口上的注解),最完整的工具类,没有现成的工具类 ...

  5. 第78节:Java中的网络编程(上)

    第78节:Java中的网络编程(上) 前言 网络编程涉及ip,端口,协议,tcp和udp的了解,和对socket通信的网络细节. 网络编程 OSI开放系统互连 网络编程指IO加网络 TCP/IP模型: ...

  6. 用java网络编程中的TCP方式上传文本文件及出现的小问题

    自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文 ...

  7. 11.Java反射机制 哦对了,前面的序号来自随笔关于编程之路的思索第一篇

    基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象的方法的功能来自于J ...

  8. java 网络编程(五)Socket多线程上传文件

    客户端: package cn.sasa.socketUploadFileDemo; import java.io.FileInputStream; import java.io.IOExceptio ...

  9. Java 反射机制详解(上)

    一.什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java ...

随机推荐

  1. Python中数据的排序

    目录 列表的排序 sort(key,reverse)方法 sorted(target,key,reverse) 函数 元组tuple的排序 sort(key,reverse)方法 sorted(tar ...

  2. 使用同步或异步的方式完成 I/O 访问和操作(Windows核心编程)

    0x01 Windows 中对文件的底层操作 Windows 为了方便开发人员操作 I/O 设备(这些设备包括套接字.管道.文件.串口.目录等),对这些设备的差异进行了隐藏,所以开发人员在使用这些设备 ...

  3. JVM虚拟机-了解Java堆中对象分配、布局和访问的全过程

    目录 前言 对象的创建 类加载检查 分配内存 内存空间分配方式 指针碰撞 空闲列表 并发时的内存分配 同步处理:CAS 本地线程分配缓冲:TLAB 初始化零值 设置对象头 执行 init 方法 对象的 ...

  4. Day002 Java三大版本

    Java三大版本 Write Once .Run Anywhere JavaSE: 标准版(桌面程序,控制台开发......) JavaME:嵌入式开发(手机,小家电.......) JavaEE:E ...

  5. 【js】Leetcode每日一题-叶子相似的树

    [js]Leetcode每日一题-叶子相似的树 [题目描述] 请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 . 举个例子,如上图所示,给定一棵叶值序列为 (6, 7 ...

  6. idea设置js为ES6

  7. 【死磕JVM】用Arthas排查JVM内存 真爽!我从小用到大

    Arthas是啥 当我们系统遇到JVM或者内存溢出等问题的时候,如何对我们的程序进行有效的监控和排查,就发现了几个比较常用的工具,比如JDK自带的 jconsole.jvisualvm还有一个最好用的 ...

  8. 运行程序显示丢失“MSVCR100D.dll”

    前言 写了一个Dll注入工具,结果发现程序在其他机器上会出现丢失"MSVCR100D.dll".这个dll是vs2010自带的动态链接库,如果在没安装vs2010运行库的电脑中使用 ...

  9. XCTF.MISC 新手篇

    目录 泪目 1.this_is_flag 2.pdf 3.如来十三掌 4.give_you_flag 5.坚持60s 6.gif 7.掀桌子 8.ext3 9.stegano 10.SimpleRAR ...

  10. Scanner, BufferedReader, InputStreamReader 与ACM模式输入

    Scanner, BufferedReader, InputStreamReader 与ACM模式输入html { -webkit-print-color-adjust: exact } * { bo ...