由于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+";");
}
}
}