27.反射2.md
目录
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的更多相关文章
- Python之路【第十一篇】前端初识之HTML
HTML HTML解释: HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他 ...
- 细谈Java
重载:相同函数名,不同参数. 重写(覆写):父类和子类之间的,子类重写了父类的方法. java的多态:重载+覆写 1. Main方法: 是public的,也是static,也是void的,参 ...
- 带你认识spark安装包的目录结构
福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 Java全栈大联盟 ...
- 1205 CSRF跨站请求与django中的auth模块使用
目录 今日内容 昨日回顾 基于配置文件的编程思想 importlib模块 简单代码实现 跨站请求伪造csrf 1. 钓鱼网站 如何实现 模拟该现象的产生 2. 解决问题 解决 {% csrf_toke ...
- Phoenix5.0的部署
官网下载编译好的二进制包 http://phoenix.apache.org/download.html2 上传并解压到指定目录, 再修改目录名称 tar -zxvf apache-phoenix-5 ...
- 题解 Medium Counting
传送门 又是神仙DP 发现如果只有两个串就很好做了 于是这个神仙DP定义就从这里下手:令 $dp[p][c][l][r] 表示在 \([s_l, s_r]\) 这段字符串中,考虑从第 \(p\) 个位 ...
- vue2.x入门学习
vue安装 # 最新稳定版本 $ npm install vue # 最新稳定 CSP 兼容版本 $ npm install vue@csp 引包 cd /d/vue/demo cnpm instal ...
- JavaSE_ 反射 目录(27)
JavaSE学习总结第27天_反射 & 设计模式 & JDK5.7.8新特性27.01 反射_类的加载概述和加载时机27.02 反射_类加载器的概述和分类27.03 反射_反射概述27 ...
- JavaSE学习总结第27天_反射 & 设计模式 & JDK5、7、8新特性
27.01 反射_类的加载概述和加载时机 类的加载:当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载:就是指将class文件读 ...
随机推荐
- centos7安装zookeeper3.4.12集群
zookeeper的三要素: 1.一致,能够保证数据的一致性 2.有头,始终有一个leader,node/2+1个节点有效,就能正常工作 3.数据树,树状结构且每个树必须有数据 1. 环境准备 操作系 ...
- CS229 6.13 Neurons Networks Implements of stack autoencoder
对于加深网络层数带来的问题,(gradient diffuse 局部最优等)可以使用逐层预训练(pre-training)的方法来避免 Stack-Autoencoder是一种逐层贪婪(Greedy ...
- Cache: a place for concealment and safekeeping.Cache: 一个隐藏并保存数据的场所
原文标题:Cache: a place for concealment and safekeeping 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限, ...
- css(层叠样式表)属性
CSS属性相关 宽和高 width属性可以为元素设置宽度. height属性可以为元素设置高度. 块级标签才能设置宽度,内联标签的宽度由内容来决定. 字体属性 文字字体 font-family可以把多 ...
- python函数的创建和函数参数
[1]#函数的作用:1.减少重复代码 2.方便修改,更容易扩展3.保持代码的一致性 [2]#函数简单的定义规则: 函数代码块以def关键词开头,后接函数标识符名称和圆括号(),任何传入参数和自变量必须 ...
- java8实战:filter的简单使用
<JAVA8实战>中的例子 要实现的功能:通过Apple的color或weight属性,对List<Apple>进行筛选. 1.首先定义com.owl.entity.Apple ...
- C# WPF DevExpress 图表控件之柱状图
说明:DevExpress版本是17.1.VS是2015. XAML: <!--#region 图表控件--> <dxc:ChartControl x:Name="char ...
- jxl 的详细用法说明
package example_1; import java.io.File; import java.io.IOException; import java.io.ObjectInputStream ...
- HDFS在web端无法访问文件
解决办法1: [root@djt002 hadoop]# vi /etc/selinux/config 改为 SELINUX=disabled 解决办法2: 查看你的$HADOOP_HOME/etc/ ...
- 关于windows中在env中执行django-admin.py出现Access is denied.的解决办法
(ll_env) E:\python\learning_log>django-admin.pyAccess is denied. 这个是路径的问题,默认的文件获取路径没能正常获取文件 我使用绝对 ...