反射--基本的用法

由于servlet没有主方法,必须借助其他程序,tomcat

非静态 无法直接调用,要new先产生类的对象 通过对象 调用 非静态方法

任何编程语言 都有遍历子目录子文件 (路径)的能力

tomcat 不知道 类 的名字无法通过new的方式获取实例

反射:通过java代码获取类一切信息(人眼能看到的),获取类的对象

类的信息:注解,属性,方法,构造方法,属性类型,属性名字,属性修饰(公有私有),方法类型,方法名字,入参数量,入参类型,入参名字。。。。。

(重点)获取信息的方法

1.对象.getclass

2.类.forName() 类路径 调用静态方法forName获得类名对应的Class对象。

tomcat通过 路径的放的反射 其他两条路走不通

3.类.class

calss x1=Person.class; //x1获取Person类信息 class x2=Cat.class; //x2 获取Cat类信息class x3=class.forName("Dog类的路径");

类信息.newlnstance获取类的实例。将forName与newlnstance配合起来使用,可以根据存储在字符串中的类名创建一个对象

必背过 v

getFields、返回类的public域(属性)

getMethods 返回类的方法

getConstructors类的构造器数组,

printConstructors(Classcl) 打印构造方法

printMethods(Class)打印方法

printFields(Classcl)打印属性(域)

intgetModifiers()返回一个用于描述构造器、方法或域的修饰符的整型数值。使用Modifier类中的这个方法可以分析这个返回值。

Field[ ]getFields()1

•Filed[ ]getDeclaredFie1ds()

getFields方法将返回一个包含Field对象的数组,这些对象记录了这个类或其超类的公有域。getDeclaredField方法也将返回包含Field对象的数组,这些对象记录了这个类的全部域。如果类中没有域,或者Class对象描述的是基本类型或数组类型,这些方法将返回一个长度为0的数组。

•Method[] getMethods()

•Method[] getDeclareMethods()

返回包含Method对象的数组:getMethods将返回所有的公有方法,包括从超类继承来的公有方法;getDeclaredMethods返回这个类或接口的全部方法,但不包括由超类继承了的方法。

•Constructor[ ] getConstructors()

•Constructor[ ] getDeclaredConstructors()

返回包含Constructor对象的数组,其中包含了Class对象所描述的类的所有公有构造器(getConstructors)或所有构造器(getDeclaredConstructors)。

•Class getDeclaringClass()

返冋一个用于描述类中定义的构造器、方法或域的Class对象。

•Class[ ] getExceptionTypes() (在Constructor和Method类中)

返回一个用于描述方法抛出的异常类型的Class对象数组。

•int getModifiers()

返回一个用于描述构造器、方法或域的修饰符的整型数值。使用Modifier类中的这个方法可以分析这个返回值。

•String getName()

返冋一个用于描述构造器、方法或域名的字符串。

•Class[ ] getParameterTypes() (在Constructor和Method类中)

返回一个用于描述参数类型的Class对象数组。

•Class getReturnType()(在Method类中)返回一个用于描述返H类型的Class对象。

用例:

package com.qcby;

import java.lang.reflect.*;


public class ReflectionTest {
	public static void main(String[] args) {
		try{
			Class cl=Class.forName("com.qcby.Person");
			Class supercl=cl.getSuperclass();
			String modifiers=Modifier.toString(cl.getModifiers());
			if(modifiers.length()>0) System.out.print(modifiers+"");
			System.out.print("class"+"com.qcby.Person");
			if(supercl !=null&&supercl!=Object.class)System.out.print("extends"+supercl.getName());
			System.out.print("\n{\n");
			printConstructors(cl);
			System.out.println();
			printMethods(cl);
			System.out.println();
			printFields(cl);
			System.out.println("}");
			}catch(ClassNotFoundException e){
				e.printStackTrace();
				}System.exit(0);
	}
	public static void printConstructors(Class cl){
		Constructor[] constructors=cl.getDeclaredConstructors();
		for(Constructor c:constructors){
			String name=c.getName();
			System.out.print("");
			String modifiers=Modifier.toString(c.getModifiers());
			if(modifiers.length()>0) System.out.print(modifiers+"");
			System.out.print(name+"(");
			Class[] paramTypes=c.getParameterTypes();
			for(int j=0;j<paramTypes.length;j++){
				if(j>0)System.out.print(",");
				System.out.print(paramTypes[j].getName());
				}System.out.println(");");
		}
	}

	public static void printMethods(Class cl){
		Method[] methods=cl.getDeclaredMethods();
		for(Method m:methods){
			Class retType= m.getReturnType();
			String name=m.getName();
			System.out.print("");
			String modifiers=Modifier.toString(m.getModifiers());
			if(modifiers.length()>0)System.out.print(modifiers+"");
			System.out.print(retType.getName()+""+name+"(");

	Class[] paramTypes=m.getParameterTypes();
	for(int j=0;j<paramTypes.length;j++){
		if(j>0) System.out.print(",");
		System.out.print(paramTypes[j].getName());
		}System.out.println(");");
		}
	}
	public static void printFields(Class cl){
		Field[] fields=cl.getDeclaredFields();
		for(Field f:fields){
			Class type=f.getType();
			String name=f.getName();
			System.out.print("");
			String modifiers=Modifier.toString(f.getModifiers());
			if(modifiers.length()>0)System.out.print(modifiers+"");
			System.out.println(type.getName()+""+name+";");
			}
		}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值