java反射机制
Posted 咕噜咕噜——干饭啦干饭啦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java反射机制相关的知识,希望对你有一定的参考价值。
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
Java反射机制主要提供了以下功能: 在运行时,判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时,判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
通过反射来检测或者修改应用某些对象在运行时的状态或者行为。允许程序在运行时通过Reflecttion APIs 动态取得任意一个已知名称的class 的内部信息,包括其修饰符(诸如public static 等等)父类(例如Object) 实现之接口(例如serializable),也包括成员变量和方法的所有信息,并可于运行时改变成员变量的内容或者调用方法(包括私有方法,我们知道被private 修饰的封装的机制,是不能被外部所使用的,但是通过反射,我们可以改变私有变量和方法)。举例:spring框架是事先就写好的框架,他内部的处理并不知道用户要写哪些类,因为那是以后由用他的人来定的,所以用户在用的时候才去配置文件中配置类路径,这是一个典型反射的例子。
因此能够实现在运行时加载、探知、使用编译期间完全未知的classes。
涉及两个类:Class and ClassLoader
ClassLoader 将各类load到内存中,一个个class就是一个一个对象,由于动态加载机制,class是一个个加载的,且是需要的时候加载。Static语句块只加载一次,而Dynamic语句块则是每次new新对 象的时候都会执行,其中核心类被bootstrap class loader 加载。通过这种方法,就可以知道这个类的名字,能够new出来一个对象:
首先加载出来:
String s = “M”;
Class c = class.forName(str); // 返回值是class对象,参数为类名;
Class.forName()的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码u
动态加载和创建Class 对象,比如想根据用户输入的字符串来创建对象时需要用到
String str = “用户输入的字符串” ;
Class t = Class.forName(str);
t.newInstance();
Object o = c.newInstance();// new一个对象
Method [] ms= c.getmethods(o);//获得所有方法
Method m1;String s1 = m1.getName();//获得方法名称
m1.invoke(o);
Invoke:可变参数的方法.形参变(Object obj,Object…args),后面可传0到多个参数
getParameterTypes()
java.lang.reflect.Method.getParameterTypes()方法返回一个Class对象数组,它们以声明顺序表示由此Method对象表示的方法的形式参数类型。如果底层方法没有参数,则返回长度为0的数组。
Method[] methods = SampleClass.class.getMethods();
Class[] parameterTypes = methods[1].getParameterTypes();
有关spring 框架:
1、Spring是一个开元的轻量级的应用开发框架,其目的是用于简化企业级应用程序开发,减少侵入;
2、Spring的IOC和AOP应用,将组件的耦合度降至最低,即解耦,便于系统的维护和升级;
3、可以与第三方框架和技术整合应用,可以自由选择技术进行开发。
注解:
a)@Component 为通用注解
b)@Repository 为持久层组件注解
c)@Service 为业务层组件注解
d)@Controller 为控制层注解
e)@Scope 为Bean的作用域注解
f)@Autowired 为指定Bean之间依赖关系的注解
g)@Inject 为指定Bean之间依赖关系的注解
h)@Value 为注入Spring表达式值的注解
j)@ResponseBody 为Ajax返回类型的注解
高亮部分为不明白的地方,希望大佬指教。。。:):):)
有些资料来源于博客和百度百科,侵删:)
以上是关于java反射机制的主要内容,如果未能解决你的问题,请参考以下文章