`
uule
  • 浏览: 6351736 次
  • 性别: 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

分享到:
评论

相关推荐

    VR材质反射基础.pdf

    《VR材质反射基础》 在虚拟现实(VR)和3D渲染领域,材质的反射是决定场景真实感的重要因素之一。本教程将详细介绍如何在VR环境中设置和调整材质的反射属性,以创建逼真的视觉效果。 首先,我们需要设置渲染参数。...

    VR材质反射基础.docx

    本文将深入探讨VR材质的反射基础,以及如何通过一系列步骤来设置和优化反射效果。 首先,我们要理解VR材质中的全局开关(Global switches)。"Default lights"选项控制是否使用场景中的默认灯光。关闭这个选项意味...

    光的反射基础资料知识讲解.doc

    【光的反射基础资料知识讲解】 光的反射是光学领域中的基本现象,指的是光线射向物体表面时,一部分光线被物体表面反射回原来的空间。这一现象涉及到一系列关键概念和定律,对于理解和应用光学原理至关重要。 **...

    【IT十八掌徐培成】Java基础第25天-01.反射基础.zip

    反射基础”这一课程中,徐培成老师会深入讲解这个核心概念。 反射的基石是`java.lang.Class`类,它代表了Java运行时的类型信息。通过`Class`对象,我们可以获取类的构造器、方法、字段等信息,甚至可以在运行时动态...

    C#反射基础学习

    这篇学习笔记将带你深入了解C#反射的基础知识,帮助你掌握这一关键技能。 1. **程序集(Assembly)**:程序集是.NET应用程序的基本部署和版本控制单位,包含了元数据和IL(中间语言)代码。你可以通过`System....

    反射基础思维导图

    内含反射的定义,反射的价值,,反射使用的方法以及xml文件的定义,价值,特点详解

    新手学习java反射基础

    Java 反射基础知识点 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。下面我们来一起学习一下吧。 一、...

    Java反射基础入门,一篇就够啦

    Java反射基础入门 Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。本文将详细介绍Java反射的基础知识,包括反射的基本概念、工作原理、使用方法及优缺点。...

    java反射笔记

    关于标签"反射基础",在Java反射基础中,还包括了泛型信息的获取、接口实现类的判断、注解的处理等内容: 1. 泛型信息:虽然Java泛型在编译后会被擦除,但通过反射仍可以获取到泛型的实际类型。 2. 接口实现:`Class...

    Java基础 反射篇.md

    ### 反射基础篇文末总结 反射是Java中一个非常强大的特性,它提供了运行时操作类的能力。虽然反射可以带来很多便利,但也需要注意其潜在的问题,合理地使用反射,可以使我们的代码更加灵活和高效。在实际开发中,...

    光的反射(基础)巩固练习.doc

    【光的反射基础巩固练习】 光的反射是光学的基本概念,涉及到光线与物体表面相互作用时的角度关系。在光的反射中,有以下几个关键知识点: 1. 入射角:光线与法线(垂直于反射面的直线)之间的角度称为入射角。 2....

    Java反射性能测试分析

    #### Java反射基础 Java反射主要依赖于以下几类API: - `java.lang.Class`: 提供了获取类信息的方法。 - `java.lang.reflect.Field`: 允许访问和修改类的字段。 - `java.lang.reflect.Method`: 用于调用类的方法。 ...

    JAVA反射详细讲解

    一、反射基础 1. 类与对象的元数据:在Java中,每个类都由Class对象表示,这个对象包含了关于类的所有信息,如类名、构造器、方法、字段等。通过Class类,我们可以获取到运行时的类信息。 2. 获取Class对象:有三...

    C#,利用反射动态创建对象

    1. **反射基础** 反射是.NET框架提供的一种特性,通过System.Reflection命名空间中的类来实现。主要类包括Assembly(程序集)、Type(类型)、ConstructorInfo(构造函数信息)、MethodInfo(方法信息)和...

    php 反射简单例子

    1. PHP反射基础 反射API是PHP内建的一组类,它提供了对类、接口、函数、方法和常量等对象的元数据访问。这些类包括`\ReflectionClass`、`\ReflectionFunction`、`\ReflectionMethod`等,它们分别用于获取关于类、...

    《剑指offer》Java基础-反射篇.pdf

    变化,需要更换不同的类实例化,频繁修改源...• 反射基础篇中,通常会涵盖上述内容,并在文末进行总结,帮助读者理解和掌握反射的核心概念和使用技巧。在面试或深入学习开源框架时,对反射的理解和运用是非常重要的。

    实战java反射机制-让你迅速认识java强大的反射机制

    1. 反射基础: Java反射机制主要基于`java.lang.Class`类和`java.lang.reflect`包中的接口和类。`Class`对象代表了运行时的类信息,通过`Class.forName()`方法可以获取到类的`Class`对象。此外,`java.lang.reflect...

    C#反射生成SQL实例

    1. **反射基础**:C#中的System.Reflection命名空间包含了所有与反射相关的类。其中,Type类是反射的核心,它可以表示任何.NET类型。通过Assembly.Load或typeof运算符可以获取Type对象。 2. **PropertyInfo和...

    Java基础精品课22-xml与反射.zip

    5. 反射基础:理解反射的概念,学习Class类和反射API的使用。 6. 动态方法调用:使用Method类调用类的方法,包括静态方法和实例方法。 7. 访问私有字段:通过反射访问和修改私有字段的值。 8. 反射与设计模式:如...

Global site tag (gtag.js) - Google Analytics