小贾漫谈——Java反射
一、Class的API
二、测试使用的JavaBean
class Admin{
//字段
public String userName;
public String pwd;
private int age;
//构造方法
public Admin(){
System.out.println("无参构造器啦。。。。。");
}
public Admin(String userName,String pwd){
System.out.println("我的用户名:"+userName+" 密码:"+pwd);
}
private Admin(int age){
System.out.println("我的保密年龄:"+age);
}
//方法
private void setAge(int age){
this.age=age;
} public int getAge(int age){
return age;
} }
三、测试
1、获取构造器并创建实例
通过getConstructors()方法获取所有的public构造器
@Test
//获取所有public的构造器
public void getAllPublicConstrutor() {
//1、先找到被调用构造器所在类的字节码
Class clazz=Admin.class;
//2、获取所有的public构造器
Constructor[] cons=clazz.getConstructors();
for (Constructor constructor : cons) {
System.out.println(constructor);
}
}
/**
* 测试结果:
* public Admin()
public Admin(java.lang.String,java.lang.String)
*/
通过getDeclaredConstructors()获取所有的构造器
@Test
//通过getDeclaredConstructors()获取所有的构造器
public void getAllConstrutor(){
Class clazz=Admin.class;
Constructor[] cons=clazz.getDeclaredConstructors();
for (Constructor constructor : cons) {
System.out.println(constructor);
}
}
/**
* 测试结果:
* public Admin()
public Admin(java.lang.String,java.lang.String)
private Admin(int)
*/
获取指定的public构造器,并创建实例
@Test
//获取指定的public构造器,并创建实例
public void ConstructorPublicInvoke() throws Exception{
//1、先找到被调用构造器所在类的字节码
Class clazz=Admin.class;
//2、找到被调用指定的构造器,传入构造器参数的字节码
Constructor construtor=clazz.getConstructor(String.class,String.class);
//3、执行构造器 创建对象
construtor.newInstance("Jack","123456");
}
/**
* 测试结果:
* 我的用户名:Jack 密码:123456
*/
获取指定的private构造器,并创建实例
@Test
//获取指定的private构造器,并创建实例
public void ConstructorInvoke() throws Exception {
//1、先找到被调用构造器所在类的字节码
Class clazz=Admin.class;
//2、找到被调用指定的构造器,传入构造器参数的字节码
Constructor construtor=clazz.getDeclaredConstructor(int.class);
//3、在调用构造器之前,设置改构造器可以被访问
construtor.setAccessible(true);
//4、执行构造器 创建对象
construtor.newInstance(13);
}
/**
* 测试结果:
* 我的保密年龄:13
*/
2、获取方法并调用方法
获取所有的public方法,以及父类的方法
@Test
//获取所有的public方法,以及父类的方法
public void getPublicMethod(){
Class clazz=Admin.class;
Method[] methods=clazz.getMethods();
for (Method method : methods) {
System.out.println(method);
}
}
/** 测试结果:
* public int Admin.getAge(int)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll() */
获取所有的方法,不包括父类的。
@Test
//获取所有的方法,不包括父类的。
public void getAllMethod(){
Class clazz=Admin.class;
Method[] methods=clazz.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
}
/**
* 测试结果:
* private void Admin.setAge(int)
public int Admin.getAge(int)
*/
调用public方法,并执行
@Test
//调用public方法,并执行
public void getPublicMethodInvoke() throws Exception{
//1、先找到被调用构造器所在类的字节码
Class clazz=Admin.class;
//2、根据方法名,获取方法
Method method=clazz.getMethod("getAge", int.class);
//3、调用方法
method.invoke(clazz.newInstance(), 23);
}
/**
* 测试结果:
* 无参构造器啦。。。。。
public方法===我的年龄是23
*
*/
调用私有方法并执行
@Test
//调用私有方法并执行
public void getMethodInvoke() throws Exception{
//1、先找到被调用构造器所在类的字节码
Class clazz=Admin.class;
//2、根据方法名,获取方法
Method method=clazz.getDeclaredMethod("setAge", int.class);
//3、设置私有方法为可调用
method.setAccessible(true);
//4、调用方法
method.invoke(clazz.newInstance(), 23);
}
/**
* 测试结果:
* 无参构造器啦。。。。。
私有方法====我的年龄是23
*/
3、设置字段和获取字段
设置和获取public的字段
@Test
//获取public的字段
public void setGetPublicFileds() throws Exception{
//1、先找到被调用构造器所在类的字节码
Class clazz=Admin.class;
//2、根据字段名获取字段
Field field=clazz.getField("userName");
//3、创建实例
Admin admin=(Admin) clazz.newInstance();
//4、设置值
field.set(admin, "Jack");
String userName= (String) field.get(admin);
System.out.println(userName);
}
/**
* 测试结果:
* 无参构造器啦。。。。。
Jack
*/
设置和获取
@Test
//设置和获取private字段
public void setGetFileds() throws Exception{
//1、先找到被调用构造器所在类的字节码
Class clazz=Admin.class;
//2、根据字段名获取字段
Field field=clazz.getDeclaredField("age");
//3、创建实例
Admin admin=(Admin) clazz.newInstance();
//4、设置字段为可见
field.setAccessible(true);
//5、设置值
field.set(admin, 15);
//6、获取值
Integer age= (Integer) field.get(admin);
System.out.println(age);
}
/**
* 测试结果:
* 无参构造器啦。。。。。
15
*/
4、获取参数泛型信息
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Map; class Gene{
public Map<String,Object> map;
}
public class GenericType {
public static void main(String[] args) throws Exception {
Class clazz=Gene.class;
Field field=clazz.getField("map");
//获取带泛型的类型
Type type=field.getGenericType();
System.out.println(type);
//java.util.Map<java.lang.String, java.lang.Object>
ParameterizedType paraType=(ParameterizedType) type;
Type[] types=paraType.getActualTypeArguments();
System.out.println(types[0]);//String
System.out.println(types[1]);//Object
/**
* 输出结果:
* class java.lang.String
class java.lang.Object
*/
}
}
1、java.lang.reflect.Type;
所有已知子接口:GenericArrayType, ParameterizedType, TypeVariable<D>, WildcardType
所有已经实现的类:Class
2、ParameterizedType 表示参数化类型,如 Collection<String>。
getActualTypeArguments():返回表示此类型实际类型参数的 Type 对象的数组。
小贾漫谈——Java反射的更多相关文章
- Java反射的小故事
Java反射的小故事: 首先定义一个Java类 package com.xiaoysec.test; public class Person { private String name; privat ...
- java反射(基础了解)
package cn.itcast_01; /** *Person类 */ public class Person { /** 姓名 */ private String name; ...
- java 反射的应用 以及通过反射 用到的工厂模式
java反射详解 本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解. 下面开始正文. [案 ...
- java反射的基础学习代码
java反射的学习,好多东西不太理解,主要分析了constructor,method,field,数组和调用main函数等反射的多个方面小例子. 主要的练习类 package javaAdvanced ...
- Java 反射练习
已同步更新至个人blog:http://dxjia.cn/2015/08/java-reflect/ 引用baidubaike上对JAVA反射的说明,如下:JAVA反射机制是在运行状态中,对于任意一个 ...
- JAVA反射机制—学习总结
最近收到很多关于Java反射机制的问题留言,其实Java反射机制技术方面没有太多难点,或许是大家在学习过程中遗漏了细小知识点,导致一些问题无法彻底理解,现在我们简单的总结一下,加深印象.什么是反射机制 ...
- java反射之Constructor简单应用
Constructor类是java反射中重要的类,它是对类中构造器的描述的类.类似于Method(对类中方法的描述的类),Field(对类中属性的描述的类). 通过创建Constructor的对象实例 ...
- Android中Java反射技术的使用示例
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Metho ...
- java反射快速入门(二)
上一遍博文 , 简单介绍java 反射的常用接口,本遍博文, 我会结合项目开发的实际例子讲解下 java反射的使用 现在有个需求, 要将一个对象转换成xml格式, 或者将一串xml转换一个对象, 这时 ...
随机推荐
- 【Orleans开胃菜系列2】连接Connect源码简易分析
[Orleans开胃菜系列2]连接Connect源码简易分析 /** * prism.js Github theme based on GitHub's theme. * @author Sam Cl ...
- 数位DP模板详解
// pos = 当前处理的位置(一般从高位到低位) // pre = 上一个位的数字(更高的那一位) // status = 要达到的状态,如果为1则可以认为找到了答案,到时候用来返回, // 给计 ...
- flask_admin 笔记四 自定义视图
定义自己的视图 对于您的要求非常具体的情况,您很难用内置的ModelView类来满足这些需求,Flask-Admin使您可以轻松地完全控制并将自己的视图添加到界面中. 1)独立视图 可以通过扩展Bas ...
- 网站遭受大量CC攻击后的应对策略
上周开始我网站遭受了一大波CC攻击,到目前为止仍在继续,作为一个建站小白,我感觉压力好大,又有新的问题要挑战了! 服务器架设在腾讯云,CC攻击很凶猛,带宽瞬间占满,于是在腾讯云后台配置安全组关闭了80 ...
- Nginx浅析
Nginx浅析 Nginx是什么 总的来说,Nginx其实就是一个和apache类似的服务器软件. Nginx是一款轻量级的Web服务器/反向代理服务器以及电子邮件代理服务器,并在一个BSD-like ...
- 机器视觉及图像处理系列之二(C++,VS2015)——图像级的人脸识别(1)
接上一篇,一切顺利的话,你从github上clone下来的整个工程应该已经成功编译并生成dll和exe文件了:同时,ImageMagic程序亦能够打开并编辑图像了,如此,证明接下来的操练你不会有任何障 ...
- [2017BUAA软工助教]剩余个人作业与deadline
软件工程剩余作业与deadline 标签(空格分隔): 软件工程 一.个人阅读作业+总结 对软件工程的学习做一个总结. 阅读下列关于软件开发本质和开发方法的博客/文章,结合自己在个人项目/结对编程/团 ...
- 在局域网内部实现远程web终端服务
在局域网内部实现远程web终端服务 前言 如题,本文主要介绍了在局域网内部实现访问web终端服务功能. 实验环境 如下图所示,实验环境由三个部分组成:分别由局域网内部客户端.重定向服务器.以及两台提供 ...
- 第十周PSP&进度条
PSP 一.表格: D日期 C类型 C内容 S开始时间 E结束时间 I时间间隔 T净时间(mins) 预计花费时间(mins) 11月17号 站立会议 分配任务 13:00 13:30 0 3 ...
- 功能WBS分解
小组名称:飞天小女警 项目名称:礼物挑选小工具 小组成员:沈柏杉(组长).程媛媛.杨钰宁.谭力铭 代码地址:HTTPS: https://git.coding.net/shenbaishan/GIFT ...