目录

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. JQuery 删除子元素

    删除元素/内容 如需删除元素和内容,一般可使用以下两个 jQuery 方法: remove() - 删除被选元素(及其子元素) empty() - 从被选元素中删除子元素 $("#div1& ...

  2. 基于centos7的真实机环境下安装 vmware workstastion

    通常我们在在虚拟机里面搭建大数据集群,如果我们换在真实机里面搭建大数据集群的话, 我们的每一台电脑就是centos系统了,这个时候如果我们需要按vmware 软件的话我们就需要下载不同的版本了 废话不 ...

  3. CS229 6.7 Neurons Networks whitening

    PCA的过程结束后,还有一个与之相关的预处理步骤,白化(whitening) 对于输入数据之间有很强的相关性,所以用于训练数据是有很大冗余的,白化的作用就是降低输入数据的冗余,通过白化可以达到(1)降 ...

  4. 小朋友学C语言(1):Hello World

    首先,需要一款C语言的编译器,可以使用在线编译器,也可以在本地安装编译器,比如Mac电脑可以安装Xcode,PC可以安装Dev C++. 若是第一次编写程序,建议使用在线编译器,推荐 菜鸟编译器 编写 ...

  5. Python源码文件中带有中文时,输出乱码

    Python源码文件中带有中文时,文件头应加注释: #!/usr/bin/env python # -*- coding: utf-8 -*- 第一行注释是为了告诉Linux/OS X系统,这是一个P ...

  6. GNU coreutils

    内核实用程序,针对文本及文件操作.涉及到102条linux命令.命令列表:cp.install.ln.mv.ls.echo…… 常见选项 1.退出状态 2.备份选项 cp, install, ln, ...

  7. Java课程作业之动手动脑(五)

    1.请阅读并运行AboutException.java示例. import javax.swing.*; class AboutException { public static void main( ...

  8. uva-10718-贪心

    题意:输入unsigned int N,L,U,找出一个M(L<=M<=U)使得N | M最大,如果有多个M使得N | M最大,取最小的M, 解题思路:贪心,从最高位开始,判断是否应该置为 ...

  9. jquery给按钮绑定事件

    JQuery: $(function(){ $("#btn1").bind("click",function(){ $("#div1").s ...

  10. python selenium 三种等待方式详解[转]

    python selenium 三种等待方式详解   引言: 当你觉得你的定位没有问题,但是却直接报了元素不可见,那你就可以考虑是不是因为程序运行太快或者页面加载太慢造成了元素不可见,那就必须要加等待 ...