目录

1.反射

定义:把一个字节码文件加载到内存中,jvm对该字节码文件解析,创造一个Class对象,把字节码文件中的信息全部存储到Class对象中,使用这个Class对象调用其属性和方法

2.类对象获取

package per.liyue.code.relfect;
public class ReflectMain {
public static void main(String[] args) throws Exception {
/*
* 类的获取
*/ //加载类方式一:forName
Class class1 = Class.forName("per.liyue.code.relfect.Person");
System.out.println("forName加载:" + class1); //加载类方式二:
Class class2 = Person.class;
System.out.println(".class方式获取:" + class2);
System.out.println("class1 == class2 ?" + (class1==class2)); //加载类方式三:
Person person = new Person();
Class class3 = person.getClass();
System.out.println("getClass方式获取:" + class3);
System.out.println("class1 == class3 ?" + (class1==class3)); }
}

3.构造函数获取

注意公有和私有构造获取区别:

  • 私有构造可获取私有构造
  • 私有构造获取类自身的构造
package per.liyue.code.reflect;
public class Person {
private String name = null;
private int id = 0; public Person(){ } public Person(String name){
this.name = name;
} private Person(String name, int id){
this.name = name;
this.id = id;
} //公有函数
public void FunPublic(int num){
System.out.println("这个公有函数的输入值是:" + Integer.toString(num));
} //私有函数
public void FunPrivate(String concent){
System.out.println("这个私有函数的输入内容是:" + concent);
} @Override
public String toString() {
// TODO Auto-generated method stub
return "成功构造一个Person对象:name为:" + this.name + "id为:" + this.id;
}
}
package per.liyue.code.reflect;
import java.lang.reflect.Constructor;
public class ReflectGetConstructor {
public static void main(String[] args) throws Exception {
//获取类对象
Class clazz = Class.forName("per.liyue.code.reflect.Person"); //1.公有构造
//1.1获取所有公有构造
Constructor[] constructors = clazz.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
} //1.2获取指定构造
Constructor c = clazz.getConstructor(String.class);
System.out.println(c); //1.3使用公有构造产生一个对象
Person p = (Person) clazz.newInstance();
System.out.println(p); //2.私有构造:注意这里会将类私有和公有构造都获取到
Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
for (Constructor constructor : declaredConstructors) {
System.out.println(constructor);
} //2.1指定私有构造获取
Constructor declaredConstructor = clazz.getDeclaredConstructor(String.class, int.class);
System.out.println(declaredConstructor); //2.2使用私有构造产生一个对象
//这里直接使用创建对象将报错,因为权限访问限制导致
//Person dP = (Person) declaredConstructor.newInstance("张三", 1);
/*
* 暴力反射
* 这里先将权限打开,后面即可使用私有构造,但是这样的情况下,单例模式是失效的,不过现实中不会这么用!
*/
declaredConstructor.setAccessible(true);
Person dP = (Person) declaredConstructor.newInstance("张三", 1);
}
}

4.函数获取

package per.liyue.code.reflect;
public class Person {
private String name = null;
private int id = 0; public Person(){ } public Person(String name){
this.name = name;
} private Person(String name, int id){
this.name = name;
this.id = id;
} //公有函数
public void FunPublic(int num){
System.out.println("这个公有函数的输入值是:" + Integer.toString(num));
} //私有函数
private void FunPrivate(String concent){
System.out.println("这个私有函数的输入内容是:" + concent);
} //静态函数
public static void FunStatic(int id){
System.out.println("这个静态函数的输入内容是:" + Integer.toString(id));
} //参数是数组
public void FunArray(int [] array){
System.out.println("这个函数输入数组长度为:" + array.length);
} //无参函数
public void FunVoid(){
System.out.println("这个函数没有入参");
} @Override
public String toString() {
// TODO Auto-generated method stub
return "成功构造一个Person对象:name为:" + this.name + "id为:" + this.id;
}
}
package per.liyue.code.reflect;
import java.lang.reflect.Method;
public class ReflectGetMethod {
public static void main(String[] args) throws Exception {
//获取类对象
Class clazz = Class.forName("per.liyue.code.reflect.Person");
Person p = (Person)clazz.newInstance(); //1.获取公有函数
Method[] m = clazz.getMethods();
for(Method method : m){
System.out.println(method);
} //1.1获取指定公有函数
Method mGet = clazz.getMethod("FunPublic", int.class);
//这里需要对象
mGet.invoke(p, 1); //2.获取私有函数
Method[] mP = clazz.getDeclaredMethods();
for(Method mp : mP){
System.out.println(mp);
} //2.1获取指定私有函数
Method mm = clazz.getDeclaredMethod("FunPrivate", String.class);
//这里需要将权限打开才能正确调用
mm.setAccessible(true);
mm.invoke(p, "哈哈");
//这里需要对象
//mGet.invoke(p, 1); //3.获取数组函数,入参为数组比较特别,需要注意
Method mA = clazz.getDeclaredMethod("FunArray", int[].class);
mA.invoke(p, new int[]{}); //4.获取静态函数:今天函数不需要类对象
Method mS = clazz.getDeclaredMethod("FunStatic", int.class);
mS.invoke(null, 123); }
}

4.注解反射

27.反射2.md的更多相关文章

  1. Python之路【第十一篇】前端初识之HTML

    HTML HTML解释: HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他 ...

  2. 细谈Java

    重载:相同函数名,不同参数. 重写(覆写):父类和子类之间的,子类重写了父类的方法. java的多态:重载+覆写 1.      Main方法: 是public的,也是static,也是void的,参 ...

  3. 带你认识spark安装包的目录结构

    福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑         Java全栈大联盟   ...

  4. 1205 CSRF跨站请求与django中的auth模块使用

    目录 今日内容 昨日回顾 基于配置文件的编程思想 importlib模块 简单代码实现 跨站请求伪造csrf 1. 钓鱼网站 如何实现 模拟该现象的产生 2. 解决问题 解决 {% csrf_toke ...

  5. Phoenix5.0的部署

    官网下载编译好的二进制包 http://phoenix.apache.org/download.html2 上传并解压到指定目录, 再修改目录名称 tar -zxvf apache-phoenix-5 ...

  6. 题解 Medium Counting

    传送门 又是神仙DP 发现如果只有两个串就很好做了 于是这个神仙DP定义就从这里下手:令 $dp[p][c][l][r] 表示在 \([s_l, s_r]\) 这段字符串中,考虑从第 \(p\) 个位 ...

  7. vue2.x入门学习

    vue安装 # 最新稳定版本 $ npm install vue # 最新稳定 CSP 兼容版本 $ npm install vue@csp 引包 cd /d/vue/demo cnpm instal ...

  8. JavaSE_ 反射 目录(27)

    JavaSE学习总结第27天_反射 & 设计模式 & JDK5.7.8新特性27.01 反射_类的加载概述和加载时机27.02 反射_类加载器的概述和分类27.03 反射_反射概述27 ...

  9. JavaSE学习总结第27天_反射 & 设计模式 & JDK5、7、8新特性

      27.01  反射_类的加载概述和加载时机 类的加载:当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载:就是指将class文件读 ...

随机推荐

  1. java 两个日期之间的天数

    private static int numDays(String start,String end){ Calendar startCal=Calendar.getInstance(); Strin ...

  2. conda和pip环境管理

    1.anaconda换源 制定清华的源: conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/ ...

  3. xinetd网络

    简单Web服务器 基本的HTTP协议 请求服务器数据 GET /文件或目录 HTTP/1.1 协议头部分(可选) /r/n(协议头结束) 服务器应答浏览器 HTTP/1.1 200 OK conten ...

  4. 关于New,delete

    new delete 为表达式.这个过程不能重载,但是分解的步骤可以重载. String* ps = newe String("Hello") 分解为: String* ps; v ...

  5. Java 13 - Java 数组

    Java 数组 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如num ...

  6. 《马哥出品高薪linux运维教程》wingkeung学习笔记-linux基础入门课程

    计算机原理概念: 1.CPU和内存中的存储单元通信线路称为总线(BUS),总线是被指令和数据复用的,所以也称为前端总线. 2.计算机中计算频率的时间标准即晶体振荡器原理,精确计算时间长度,根据相同的时 ...

  7. Jquery ajax 参数 详解

    Jquery ajax 参数主要如下: url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get ...

  8. 禁用firefox 56自动更新

    firefox 56支持旧式扩展,这很重要! 它却自动更新,简单地关了也不行,很是牛氓! ========== -备份C:\Users\用户名\AppData\Roaming\Mozilla\Fire ...

  9. 【ASP.NET 进阶】PDF文件在线预览(类似百度文库)

    工作需要完成文档的在线预览,现在完成了第一步PDF文件的预览,步骤是通过PDF转换工具pdf2swf.exe把PDF文件转换为SWF文件,然后通过FlexPaper就可以预览了.效果如下(GIF图片太 ...

  10. 使用STM32的USART的同步模式Synchronous调戏SPI[2] 【实现spi 9bit】

    [原创出品§转载请注明出处] 出处:http://www.cnblogs.com/libra13179/p/7064533.html 上回说道使用USART的来模拟SPI通讯.说说一下我什么写这个的原 ...