目录

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. set函数&操作

    集合的交叉并补 交集, 共同的部分 set1 & set2 set1.intersection(set2) 差集 set1有set2没有的元素 set1 - set2 set1.differe ...

  2. Android:真机调试遇到的问题(INSTALL_FAILED_CANCELLED_BY_USER和INSTALL_FAILED_INSUFFICIENT_STORAGE)

    Android:真机调试遇到的问题(INSTALL_FAILED_CANCELLED_BY_USER和INSTALL_FAILED_INSUFFICIENT_STORAGE) 刚开始做Android开 ...

  3. 《Linux 性能及调优指南》1.5 网络子系统

    翻译:飞哥 (http://hi.baidu.com/imlidapeng) 版权所有,尊重他人劳动成果,转载时请注明作者和原始出处及本声明. 原文名称:<Linux Performance a ...

  4. Django中的视图

    Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...

  5. 初级安全入门—— WEBshell与文件上传漏洞

    概念介绍 WebShell网页木马文件 最常见利用文件上传漏洞的方法就是上传网站木马(WebShell)文件,根据开发语言的不同又分为ASP木马.PHP木马.JSP木马等,该木马利用了脚本语言中的系统 ...

  6. windows下git的使用

    1.安装git 下载地址:https://git-scm.com/download/win

  7. 认识JDBC

    内容: 1.JDBC介绍 2.JDBC入门 3.JDBC工具类实际使用 4.预处理对象 5.JDBC连接池 1.JDBC介绍 (1)基本概念介绍 什么是JDBC: JDBC(Java DataBase ...

  8. eclipse创建的maven项目中使用javafx

    类似普通maven项目,不需要特地创建javafx项目. 将fxml资源文件放在resource目录下即可.

  9. IntelliJ IDEA tomcat 远程Ddbug调试

    在开发过程中 有时候需要idea Ddbug 服务器代码,如下是配置步骤 1.需要测试服务器开通相应端口提供远程调试 2.idea配置 最后  点击Apply  OK idea配置就完成了 3.测试服 ...

  10. 关于xampp默认安装后mysql/mariadb密码的修改

    关于xampp默认按照后mysql/mariadb密码的修改 默认安装的mysql/mariadb 是没有密码的 只能跳过  然后进行修改密码 /opt/lampp/bin/mysqld_safe - ...