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返回类型的注解

  高亮部分为不明白的地方,希望大佬指教。。。:):):)

  有些资料来源于博客和百度百科,侵删:)

posted @ 2018-04-25 21:45  芩溪儿  阅读(164)  评论(0编辑  收藏  举报