`
uule
  • 浏览: 6305607 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

反射基础

阅读更多

十年架构师不到400行手写一个Spring MVC

 

假定你的web application 名称为news,你在浏览器中输入请求路径:

http://localhost:8080/news/main/list.jsp

 

则执行下面向行代码后打印出如下结果:

1、 System.out.println(request.getContextPath());

打印结果:/news

 

2、System.out.println(request.getServletPath());

打印结果:/main/list.jsp

 

3、 System.out.println(request.getRequestURI());

打印结果:/news/main/list.jsp

 

4、 System.out.println(request.getRealPath("/"));

打印结果:F:\Tomcat 6.0\webapps\news\test

 

request.getScheme();

返回的协议名称,默认是http

 

request.getServerName()

返回的是你浏览器中显示的主机名,你自己试一下就知道了

 

getServerPort()

获取服务器端口号

 

 

类Class:

https://blog.csdn.net/u011240877/article/details/54604146 (类、属性、方法)

 

//使用反射第一步:获取操作类MethodDemoFieldDemo所对应的Class对象

Class < ?>cls = Class.forName("com.testReflect.MethodDemo");

//使用MethodDemo类的class对象生成 实例

MethodDemo factory = (MethodDemo)c.newInstance();

 

1. 使用Class.forName( )静态方法的目的是为了动态加载类。在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作。因此,单单使用Class.forName( )是动态加载类是没有用的,其最终目的是为了实例化对象。

 

2.Class.forName()的作用是要求JVM查找并加载指定的类,首先要明白,java里面任何class都要装载在虚拟机上才能运行,而静态代码是和class绑定的,【class装载成功就表示执行了你的静态代码了】【而且以后不会再走这段静态代码了】。

 

Class.getName():以String的形式,返回Class对象的“实体”名称;

返回com.test.Apple

Class.getSimpleName():获取源代码中给出的“底层类”简称。

返回Apple

 

clazz.getInterfaces()方法: 获取类实现的接口

如:

public class Person implements eagle,whal

Class<?> string01 = person.getClass().getInterfaces()[0];

//获得person对象所实现的第一个接口

 

 

属性Field:

http://www.51gjie.com/java/791.html

https://blog.csdn.net/u014102846/article/details/81481126

 

1. Class.getDeclaredField(String name);

返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段(包括私有成员)。

 

2. Class.getDeclaredFields();

返回 Field 对象的一个数组,该数组包含此 Class 对象所表示的类或接口所声明的【所有字段】(包括私有成员)。

 

3. Class.getField(String name);

返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。

 

4. Class.getFields();

返回一个包含某些 Field 对象的数组,该数组包含此 Class 对象所表示的类或接口的所有【可访问公共字段】。

 

主要方法

getType(): 【获取属性声明时类型对象】(返回class对象)

getGenericType() : 返回属性声的Type类型

getName() : 获取属性声明时名字

getAnnotations() : 获得这个属性上所有的注释

getModifiers() : 获取属性的修饰

isEnumConstant() : 判断这个属性是否是枚举类

isSynthetic() : 判断这个属性是否是 复合类

 

get(Object obj) : 【取得obj对象这个Field上的值】

返回指定对象obj上此 Field 表示的字段的值

set(Object obj, Object value) : 【向obj对象的这个Field设置新值value】

将指定对象变量上此 Field 对象表示的字段设置为指定的新值

 

 

Method:

http://www.51gjie.com/java/796.html

 

获取Method类对象

一共有4种方法,全部都在Class类中:

1. getMethods(): 获得类的public类型的方法

2. getMethod(String name, Class[] params): 获得类的特定方法,name参数指定方法的名字,params参数指定方法的参数类型

3. getDeclaredMethods(): 获取类中所有的方法(public、protected、default、private)

4. getDeclaredMethod(String name, Class[] params): 获得类的特定方法,name参数指定方法的名字,params参数指定方法的参数类型

 

Method.invoke() 反射调用一个方法,当然一般只用于正常情况下无法直接访问的方法(比如:private 的方法,或者无法或者该类的对象)。

 

参数:

第一个参数是方法属于的对象(如果是静态方法,则可以直接传 null)

第二个可变参数是该方法的参数

A a1 = new A();
Class c = a1.getClass();

// 2.获取方法 名称和参数列表来决定 getMethod获取的是public的方法 getDelcaredMethod自己声明的方法
try {
	System.out.println("==================调用print(int a, int b)方法");
	// Method m = c.getMethod("print", new Class[]{int.class,int.class});
	Method m = c.getMethod("print", int.class, int.class);

	// 方法的反射操作
	// a1.print(10, 20);方法的反射操作是用m对象来进行方法调用 和a1.print调用的效果完全相同

	// 方法如果没有返回值返回null,有返回值返回具体的返回值
	// Object o = m.invoke(a1,new Object[]{10,20});
	Object o = m.invoke(a1, 10, 20);	
}

 

java.lang.reflect.Method.getParameterTypes()方法返回一个Class对象数组,它们表示【此Method对象的方法的形式参数类型】。如果底层方法没有参数,则返回长度为0的数组。

即方法上参数类型:

import java.lang.reflect.Method;

public class MethodDemo {

   public static void main(String[] args) {
      Method[] methods = SampleClass.class.getMethods();
      Class[] parameterTypes = methods[1].getParameterTypes();

      for(Class parameterType: parameterTypes){
         System.out.println(parameterType.getName());   
      }
   }
}


class SampleClass {
   private String sampleField;

   public String getSampleField() {
      return sampleField;
   }

   public void setSampleField(String sampleField) {
      this.sampleField = sampleField;
   } 
}

 

结果:

java.lang.String

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics