反射机制

Java 反射

╄→尐↘猪︶ㄣ 提交于 2019-12-01 17:30:02
1 //-- 练习使用反射技术获取带有@Controller 标注的方法,并执行它。 2 3 import java.lang.reflect.*; 4 /** 5 * 设计模式+反射+注解(xml) Spring Hibernate MyBatis 6 * 反射机制 7 * :Java语言提供的一种可以窥探class类里的属性和方法技术。 8 * 原理: 9 */ 10 public class Demo03 { 11 public static void main(String[] args) throws Exception { 12 //-- 1.拿到Student类的类对象,也就是那个Class类型的对象 13 //-- 2. 获取的方式:方式一: 14 Class c1 = Class.forName("day02.Student");//包+类名 15 //-- 方式二: 16 Class c2 = Student.class; 17 //System.out.println(c1 == c2); 18 //-- 问题一: Student类什么时候获取的:类加载 19 //-- 问题二: 什么时候类会被加载: 20 //Student stu;不会加载Student(可以利用静态代码块模拟看) 21 //-- 3. 使用 Class 对象获取类的属性 22 Field

Java 反射

浪尽此生 提交于 2019-12-01 13:48:06
前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码) JAVA反射机制 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种 动态获取 的信息以及 动态调用 对象的方法的功能称为java语言的反射机制。 要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象。 反射就是把java类中的各种成分映射成一个个的Java对象。 在加载类时,通过.java文件创建一个Class对象,一个类多次加载也只有一个Class对象。 Class 类的实例表示正在运行的 Java 应用程序中的类和接口。也就是jvm中有N多的实例每个类都有该Class对象。(包括基本数据类型) Class 没有公共构造方法。 Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。也就是这不需要我们自己去处理创建,JVM已经帮我们创建好了。 获取字节码文件对象(Class)的三种方法 通过 getClass(),object是一个引用变量,指向堆中对象 通过 类名.class 通过类的全限定名(即路径,包+"."+类名),调用静态方法Class.forName

Java反射

一个人想着一个人 提交于 2019-12-01 13:23:38
引用简述文章:https://www.jianshu.com/p/9be58ee20dee 定义: Oracle官方对反射的解释是 Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fields, methods, and constructors to operate on their underlying counterparts, within security restrictions. The API accommodates applications that need access to either the public members of a target object (based on its runtime class) or the members declared by a given class. It also allows programs to suppress default reflective access control. 简而言之是在 运行状态 中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象

java框架的核心:反射机制详解

风格不统一 提交于 2019-12-01 12:46:07
假设我们有一个Master类,下面我开始对该类进行反射机制的研究: class Master{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Master(String name,int age){ this.name=name; this.age=age; } public Master(){ } } 下面我来写一个ObjectUtil类,该类的私有变量和构造函数如下 private Map<String, Class> map=null;//用来存放待处理类中存在的属性以及属性类型 private static Object object;//我们要处理的类 public ObjectUtil(Object object){ this.object=object; } 一. Field类 Field在jdk中的描述:提供有关类或接口的单个字段的信息,可以对它的动态访问权限。因此

Java反射优化

家住魔仙堡 提交于 2019-12-01 11:10:18
公司转正答辩的时候被问到,在利用反射的时候,如果并发量比较大的情况下,如何进行优化,当时比较紧张,大脑一片空白,时候回来查找了一些资料,在这里做一些总结 首先先了解一下,java的反射为什么慢 反射Field/get 跟着源码看下,最后是使用FieldAccessor来获取的: 都是写使用Unsafe类来访问的,Unsafe类是Java中可以像C语言中那样使用指针偏移来操作Java对象(还有并发CAS等)的一个工具类,这个类的实现是JNI的C++代码: [java] view plain copy jlong sun::misc::Unsafe::getLong (jobject obj, jlong offset) { jlong *addr = (jlong *) (( char *) obj + offset); spinlock lock; return *addr; } C++中其实就是简单的通过基地址和偏移来指针运算拿到内存值,感觉上没有什么劣势,只有JNI,但Unsafe可是JVM自带的JNI(Intrinsic function?),性能应该不会差。 但是JNI毕竟是JNI,这让JVM无法预知它的行为带来的影响,本来可以有的很多优化被此JNI调用给隔绝了,而Java本来就是靠动态优化吃饭的(Java是门半编译型半解释型语言,不像C++靠编译优化)

C# 反射简单介绍

試著忘記壹切 提交于 2019-12-01 10:18:52
原文: https://blog.csdn.net/wu1020300665/article/details/82958455 1.什么是反射 反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类、结构、委托、接口和枚举等)的成员和成员的信息。有了反射,即可对每一个类型了如指掌。另外我还可以直接创建对象,即使这个对象的类型在编译时还不知道。 2.反射简单例子 平时我们写调用dll都是添加引用,然后new对象,如 通过反射,我们可以实现同样的效果,而不需要添加引用, 2.1我们先加载需要反射的dll (3种方式,第一种最常用(通常我们把需要反射的dll丢在当前路径下面)) Assembly assembly = Assembly.Load("Ruanmou.DB.Sqlserver");//1 动态加载 默认加载当前路径的dll文件,不需要后缀 //Assembly assembly1 = Assembly.LoadFile(@"E:\online7\20160928Advanced7Course2Reflection\MyReflection\MyReflection\bin\Debug\Ruanmou.DB.Sqlserver.dll");// 必须是完整路径 //Assembly assembly2 = Assembly.LoadFrom(

java基础(32):类加载、反射

橙三吉。 提交于 2019-12-01 08:28:56
1. 类加载器 1.1 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。 加载   就是指将class文件读入内存,并为之创建一个Class对象。   任何类被使用时系统都会建立一个Class对象 连接   验证 是否有正确的内部结构,并和其他类协调一致   准备 负责为类的静态成员分配内存,并设置默认初始化值   解析 将类的二进制数据中的符号引用替换为直接引用 初始化   就是我们以前讲过的初始化步骤 1.2 类初始化时机 1. 创建类的实例 2. 类的静态变量,或者为静态变量赋值 3. 类的静态方法 4. 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象 5. 初始化某个类的子类 6. 直接使用java.exe命令来运行某个主类 1.3 类加载器 负责将.class文件加载到内在中,并为之生成对应的Class对象。 虽然我们不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行 1.4 类加载器的组成 Bootstrap ClassLoader 根类加载器   也被称为引导类加载器,负责Java核心类的加载   比如System,String等。在JDK中JRE的lib目录下rt.jar文件中 Extension ClassLoader 扩展类加载器  

反射

…衆ロ難τιáo~ 提交于 2019-12-01 08:03:23
原文链接: https://www.cnblogs.com/lzq198754/p/5780331.html 1 反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 2 反射机制能做什么 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类; 在运行时构造任意一个类的对象; 在运行时判断任意一个类所具有的成员变量和方法; 在运行时调用任意一个对象的方法; 生成动态代理。 3 反射机制的相关API 通过一个对象获得完整的包名和类名 Java | 复制 1 2 3 4 5 6 7 8 package net.xsoftlab.baike; public class TestReflect { public static void main(String[] args) throws Exception { TestReflect testReflect = new TestReflect(); System.out.println(testReflect.getClass().getName()); // 结果 net.xsoftlab.baike.TestReflect } } 实例化Class类对象 Java

python--反射机制

﹥>﹥吖頭↗ 提交于 2019-12-01 06:57:53
一、反射机制简介:   通过字符串的形式导入模块   通过字符串的形式,去模块中寻找指定的函数,并执行   规定用户输入格式 模块名/函数名 通过__import__的形式导入模块,并通过 hasattr和getattr 检查并获取函数返回值。   相关方法:     getattr:--根据字符串的形式去某个模块中寻找东西     hasattr:--根据字符串的形式去某个模块中判断东西是否存在     setattr:--根据字符串的形式去某个模块中设置东西     delattr:--根据字符串的形式去某个模块中删除东西 二、反射机制初识: test.py #!/usr/bin/env python # -*- coding:utf-8 -*- def f1(): return '我是F1,我被调用了' def f2(): return '我是F2,我被调用了' def f3(): return '我是F3,我被调用了' index.py #!/usr/bin/env python # -*- coding:utf-8 -*- """ 反射机制 1.根据字符串的形式导入模块。 2.根据字符串的形式去对象(某个模块)中操作其成员  实现思路:规定用户输入格式 模块名/函数名 通过__import__的形式导入模块,并通过 hasattr和getattr 检查并获取函数返回值。

Java安全初学之反射

こ雲淡風輕ζ 提交于 2019-12-01 06:09:27
前言: 复现fastjson的时候深深意识到了需要好好学习一下Java和Java安全,激情的学习了一番java安全中重要的几部分:反序列化、反射、rmi、动态代理,从反射开始做个总结。 反射:java虚拟机在运行时获取获取类的结构信息并调用其方法和属性 也就是说,反射机制和普通方式最大的区别是,普通方式(也就是我们通过正常的new对象或者import类)需要在编译时就找到和检查类的.class文件,而反射机制是在运行时做这一步骤。 反射机制用到的类: Class:获取类的Class对象 Constructor:通过指定参数创建对象 Method:获取类的方法 Filed: 获取类的属性 Array:动态创建数组,访问数组元素 反射代码举例: import java.lang.Class; import java.lang.reflect.Constructor; import java.lang.reflect.Method; //构造方法为私有方法的反射调用 //类为私有 无法通过类newInstance对象 故通过getDeclaredConstructor获取私有构造方法再通过构造方法newInstance实例对象 public class reflectTest1 { public static void main(String args[]){ try { Class