Spring基础之 反射(Reflection)
1.了解Class
package com.inspire.reflection.Class_api; import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method; public class ClassUtils {
public static void main(String[] args) {
String s="abc";
printclassFieldMessage(s);
printClassMethodMessage(s);
}
/**
* 打印类的信息,成员方法
* @param obj 该对象所属类的信息
*/
public static void printClassMethodMessage(Object obj){
//获取类的信息,获取类的类类型
Class c1=obj.getClass();//传递的哪个子类的对象,c就是该子类的类类型
//获取类的名称
System.out.println("类名是:"+c1.getName());
//获取方法
/*
Method类,方法的对象
一个成员方法就是一个Method对象
getMethods方法获取的是所有的public的方法,包括父类继承而来的
getDeclaredMethods方法获取的是所有该类自己定义的方法。不问访问权限
*/
Method[] methods=c1.getMethods();
// Method[] method=c1.getDeclaredMethods();
for (int i = 0; i <methods.length ; i++) {
//获取方法的返回值类型的类类型(比如返回String类型,返回的是String.class)
Class returnType=methods[i].getReturnType();
System.out.print(returnType.getName()+" "); //获取方法的名称
System.out.print(methods[i].getName()+"("); //获取参数类型 获取的是参数列表类型的类类型
Class[] paramType=methods[i].getParameterTypes(); for (Class c:paramType) {
System.out.print(c.getName()+",");
}
System.out.println(")");
}
}
/**
* 打印类的信息,成员变量
* @param obj
*/
public static void printclassFieldMessage(Object obj) {
//获取成员变量
/**
* 成员变量也是对象
* java.lang.reflect.Field
* Field封装了关于成员变量的操作
* getFields方法获取的是所有的public的成员变量信息
* getDeclaredFields()获取的是该类自己声明的成员信息(public/private)
*/
Class c1=obj.getClass();//传递的哪个子类的对象,c就是该子类的类类型
//Field[] fields=c1.getFields();
Field[] fields=c1.getDeclaredFields();
for (Field f:fields) {
//得到成员变量类型的类类型
Class fieldType=f.getType();
//得到成员变量的名称
String typeName=f.getName();
System.out.println(typeName+" "+fieldType);
}
}
/**
* 打印对象的构造函数的信息
* @param obj
*/
public static void printClassConMessage(Object obj){
Class c=obj.getClass();
/*
构造函数也是对象
java.lang.Constructor中封装了构造函数的信息
getDeclaredConstructor获取自己声明的构造函数
*/
Constructor[] constructors=c.getDeclaredConstructors();
//Constructor[] constructors=c.getConstructors();
for (Constructor constructor:constructors) {
System.out.println(constructor.getName()+"(");
//获取构造函数的参数列表
Class[] paramType=constructor.getParameterTypes();
for (Class c1:paramType) {
System.out.print(c1.getName()+",");
}
System.out.println(")");
}
}
}
2.获取一个类的类对象
(1).定义一个类
public class Student {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
private int age;
}
(2).获取类对象
public class ClassDemo1 {
public static void main(String[] args) {
//Student的实例对象如何表示?
// Student student=new Student();
/*Student也是实例对象,是Class类的实例对象。如何表示?
任何一个类都是Class类的实例对象,都有三种表示方法
*/
//方式一:任何一个类都有一个隐含的静态成员class
Class c1=Student.class;
//方式二:已知该类的对象,通过getClass方法
Student student=new Student();
Class c2=student.getClass();
/*
c1,c2表示了Student类的类类型(Class type)
万事万物皆对象
类也是对象,是Class类的实例对象
这个对象我们称为该类的类类型
*/
//c1,c2都代表了Student类的类类型,一个类只可能是Class类的一个实例对象
System.out.println(c1==c2); //true
//方式三:
try {
Class c3=Class.forName("com.inspire.reflection.Class_object.Student");
System.out.println(c2==c3); //true
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
/*
有了类的类类型,我们可以通过类类型创建该类的对象.即通过c1,c2,c3创建对象
*/
try {
Student student1= (Student) c1.newInstance();
//调用方法
student1.getAge();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
3.通过反射调用方法
public class Printer {
public void printA(){
System.out.println("无参的方法..........");
}
public void printA(int a,int b){
System.out.println(a+":"+b);
}
}
public class MethodDemo {
public static void main(String[] args) {
Printer printer=new Printer();
Class c=printer.getClass();
try {
//获取方法
Method method= c.getDeclaredMethod("printA", int.class, int.class);//获取自己声明的方法
//c.getMethod("printA", int.class, int.class);//获取public的方法
//方法的反射操作
method.invoke(printer,1,3); //放回方法的返回值
System.out.println("=========================");
Method method1=c.getDeclaredMethod("printA");
method1.invoke(printer);
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.通过反射理解泛型
java中泛型是防止错误输入的。只在编译时有效。编译之后集合的泛型是去泛型化的
public static void main(String[] args){
ArrayList<String> list1=new ArrayList<String>();
list1.add("hello");
ArrayList list2=new ArrayList<String>();
//System.out.println(c1==c2);//结果为true,说明编译之后集合的泛型是去泛型化的
Class c2=list1.getClass();
try {
Method method=c2.getMethod("add", Object.class);
//注意这里:虽然上面定义list1时是String类型的,但是这里可以加入int类型的数据
method.invoke(list1,100);
System.out.println(list1.size());
System.out.println(list1);//不能用foreach遍历,类型不一样了
} catch (Exception e) {
e.printStackTrace();
}
}
Spring基础之 反射(Reflection)的更多相关文章
- Spring学习笔记(二)Spring基础AOP、IOC
Spring AOP 1. 代理模式 1.1. 静态代理 程序中经常需要为某些动作或事件作下记录,以便在事后检测或作为排错的依据,先看一个简单的例子: import java.util.logging ...
- .NET 反射(Reflection)
这节讲一下.NET 中的一个技术:反射(Reflection). 反射是一种很重要的技术,它可以在程序运行时,动态的获取类的实例,并调用实例中的任何方法.它就像一面镜子,映射出一个类的所有细节. ...
- [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦
[.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...
- [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程
[.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...
- [整理]C#反射(Reflection)详解
本人理解: 装配件:Assembly(程序集) 晚绑定:后期绑定 MSDN:反射(C# 编程指南) -----------------原文如下-------- 1. 什么是反射2. 命名空间与装配件的 ...
- 代理(Proxy)和反射(Reflection)
前面的话 ES5和ES6致力于为开发者提供JS已有却不可调用的功能.例如在ES5出现以前,JS环境中的对象包含许多不可枚举和不可写的属性,但开发者不能定义自己的不可枚举或不可写属性,于是ES5引入了O ...
- Spring基础系列-容器启动流程(1)
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9870339.html 概述 我说的容器启动流程涉及两种情况,SSM开发模式和Spri ...
- Spring基础系列--AOP织入逻辑跟踪
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9619910.html 其实在之前的源码解读里面,关于织入的部分并没有说清楚,那些前置.后 ...
- 第65节:Java后端的学习之Spring基础
Java后端的学习之Spring基础 如果要学习spring,那么什么是框架,spring又是什么呢?学习spring中的ioc和bean,以及aop,IOC,Bean,AOP,(配置,注解,api) ...
随机推荐
- Java中一个线程只有六个状态。至于阻塞、可运行、挂起状态都是人们为了便于理解,自己加上去的。
java中,线程的状态使用一个枚举类型来描述的.这个枚举一共有6个值: NEW(新建).RUNNABLE(运行).BLOCKED(锁池).TIMED_WAITING(定时等待).WAITING(等待) ...
- 【转】玩玩你的Windows防火墙——穿透与防御
前言:在防火墙专区,我经常看见朋友们讨论,“某某防火墙的性能如何”,亦或是,“某某防火墙的防御能力如何”.实际上,一个防火墙所履行的基本职责便是“网络访问控制”,即放行我们允许的通信,阻止我们未允许的 ...
- Qt中静态变量使用方法
静态变量可以在各个页面之前使用 先定义一个用于存放静态变量的类 例如datavar 在datavar.h中添加如下代码 #ifndef DATAVAR_H #define DATAVAR_H #inc ...
- Hyper-V 安装系统
注: 如屏幕前的您没有一定的网络知识(可能会使你的网络造成错乱),请勿按该文档操作. // 注:如果开启了Hyper-V,再使用VMware时在VMware上会报错,需把这里关闭后重启实体机后再开启V ...
- vmware 12中安装苹果系统
我用的系统是win10... 一.所需软件: 1.下载并安装VMware Workstation Pro 12 密码:7ybc和序列号 密码是:bwm0 2.下载unlocker 203(for OS ...
- AI 最小二乘法
最小二乘法 参考链接: https://zhuanlan.zhihu.com/p/27204466
- 在Linux下,如何分析一个程序达到性能瓶颈的原因
0.在Linux下,如何分析一个程序达到性能瓶颈的原因,请分别从CPU.内存.IO.网络的角度判断是谁导致的瓶颈?注意现在的机器CPU是多核 1.用sar -n DEV 1 10 2.用iotop命令 ...
- Java:内省(Introspector)
内省(Introspector) 是Java 语言对 JavaBean 类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且 ...
- CF1028G Guess the Numbers 构造、记忆化搜索
传送门 考虑如果我们当前可以询问\(x\)个数,还剩下\(q\)次询问机会,我们要怎么构造询问方式? 肯定会这么考虑: 找到一个尽可能大的\(P\)满足\([x,P]\)能在每一次能询问\(x\)个数 ...
- java json字符串传递给 js 时 特殊字符转义错误 研究
一些换行 回车等符号需要转义 主要注意 单引号 与双引号. 一 如果js以 双引号接收字符串 则转单引号 " 至 \" 否则js报错 二 如果js以 单引号接收字符串 则转单引号 ...