Java反射

框架的概念及用反射技术开发框架的原理

老子叫甜甜 提交于 2020-03-18 12:42:17
某厂面试归来,发现自己落伍了!>>> 一、框架与工具类概念 我做房子卖给用户住,由用户自己安装门窗和空调,我做的房子就是框架,用户需要使用我的框架,把门窗插入进我提供的框架中。 框架与工具类有区别,工具类被用户的类调用,而框架则是调用用户提供的类 。 二、框架要解决的核心问题 1、我在写框架(房子)时,你这个用户可能还在上小学,还不会写程序呢?我写的框架程序怎样能调用到你以后写的类(门窗)呢? 2、因为在写才程序时无法知道要被调用的类名,所以,在程序中无法直接new 某个类的实例对象了,而要用反射方式来做。 三、综合案例 1、先直接用new 语句创建ArrayList和HashSet的实例对象,演示用eclipse自动生成 ReflectPoint类的equals和hashcode方法,比较两个集合的运行结果差异。 2、然后改为采用配置文件加反射的方式创建ArrayList和HashSet的实例对象,比较观察运行结果差异。 四、代码说明 1、HashCodeReflectTest.java package staticimport.reflect; import java.io.FileInputStream; import java.io.InputStream; import java.util.Collection; import java.util.Properties;

java语言为什么要实现反射?反射实现的意义何在?

社会主义新天地 提交于 2020-02-28 16:31:33
1.概念 反射的概念 在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能称为 JAVA语言 的 反射机制。 2.为什么要实现反射? 我们知道,java程序中许多对象在运行时都会出现两种类型: 编译时类型和运行时类型 ,编译时类型由声明 该对象时使用的类型 决定,运行时类型由 实际赋给对象的类型 决定,例如:Pet pet=new Dog(),此时对象pet的 编译时类型是pet , 运行时类型是Dog ,因为只有在程序运行的时候才能知道平pet 引用 的内容改为了Dog,所以称之为运行时类型。 除此之外,程序运行时还可能接收到外部传入的一个对象,该对象的编译类型是object,但 程序又需要调用该对象运行时类型的方法 。为了解决这些问题,程序需要在 运行时发现对象和类的真实信息 。然而,如果 编译时根本无法预知该对象的类可能属于哪些类 ,程序只依靠运行时信息来发现该对象和类的真实信息,此时必须使用反射。 3.实现功能 反射的概念 在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能称为 JAVA语言 的反射机制。 Java反射的三个动态性质: 1、运行时生成对象实例。 2

java 通过反射获取调用类方法及属性

筅森魡賤 提交于 2019-12-10 20:43:10
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 首先说下反射是什么?反射是Sun公司推出的一组API,此组API位于Java.lang.reflect中 反射的作用是编写工具(例如eclipse),编写框架,当然对于一般的程序,我们不可能用反射来做这些事,一般反射大多是用于在构建类的实例以及调用类方法及属性。 ok! 了解了反射是什么以及反射的应用领域,那么就来看看Java中是怎么实现反射的吧 Student类 public class Student { public String name; public String gender; public int age; public Student(){ } } 使用反射获取类的实例 public class Test { public static void main(String[] args)throws ReflectiveOperationException { //通过三种方式获取类的类对象 Class<?> c=Student.class; Class<?> c1=new Student().getClass(); Class<?> c2=Class.forName("Student");//通过包名.类名获取类对象(因为该类在default包,所以可以不写包名) /

Quartz定时任务(四)

孤者浪人 提交于 2019-11-27 08:03:26
1.测试用例 package com.ninemax.application.quartz.loader; import java.io.File; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import org.quartz.JobDetail; import com.ninemax.application.quartz.model.MyJob; /** * 利用JAVA反射调用定时任务 * * @author Darker * */ @SuppressWarnings("all") public class ClassLoaderTest { public static void main(String[] args) { // 读取指定JAR包 File jarFile= new File("E:/Worksapces2015/Vip/WebRoot/WEB-INF/lib/quartz-1.8.3.jar"); // 读取指定的类 File classFile= new File("E:

Java高级编程

喜夏-厌秋 提交于 2019-11-26 18:30:35
一般情况下,我们并不能对类的私有字段进行操作,但有的时候我们又必须有能力去处理这些字段,这时候,我们就需要调用AccessibleObject上的setAccessible()方法来允许这种访问,而由于反射类中的Field,Method和Constructor继承自AccessibleObject,因此,通过在这些类上调用setAccessible()方法,我们可以实现对这些字段的操作。今天项目中遇到了一个问题,要调用一个类,并获取这个类的属性进行赋值然后将这个类传递到方法中做为参数。 实际操作时才发现,这个类中的字段属性是私有的,不能进行赋值!没有提供公有的方法。而这个类又是打包成jar给我的,我还不能更改它的代码,以至于想手动给它写个set方法都是问题。后来想到用反射可以解决这个问题,于是试了一下,果然! 反射看来根本不区分是否是private的,调用本身的私有方法是可以的,但是调用父类的私有方法则不行,纠其原因很有可能是因为getDeclaredMethod方法和getMethod方法并不会查找父类的私有方法,自己写递归可以解决,不过利用反射来做的话性能不会太好。 我们来看下面这个代码。 Field[] fields = obj.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { fields[i]