-
成员变量也是对象
getFields()方法获取的是所有的public的成员变量的信息 返回Field[]
java.lang.reflect.Field 封装了关于成员变量的操作
getDeclaredFields()获取的是该类自己声明的成员变量的信息
getType()获取成员变量的类类型
getName()获取成员变量的名称
构造函数也是对象
getConstructors()获取所有的public的构造函数,返回Constructor[]
getDeclaredConstructors()得到所有构造函数,包括所有访问修饰符。
java.lang.Constructor中封装了构造函数的信息
getName()获取构造函数名称
getParameterTypes()获取参数列表的类类型,返回Class[]
查看全部 -
getName():获取类类型的具体名称。如果是类形式的,名称为类的全称,例如:c1的类类型名称为int,c2的类类型名称为java.lang.String。
getSimpleName():不包含包名的类的名称。(例如:c2的类类型名称为String)
void关键字 都存在类型
Method类
一个成员方法就是一个Method对象
getMethod()方法获取的是所有的public的函数,包括父类继承而来的方法
getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限
getReturnType();获得方法返回值类的类类型
getParameterTypes();获得参数列表的类类的类类型 Class[]
查看全部 -
Class.forName("类的全称")
不仅表示了类的类类型,还表示了动态加载类
编译时刻加载类是静态加载类、运行时刻加载类是动态加载类
描述:在 main 函数中,有一个 String args[] 参数,这就表示在执行某 .class 文件时,可以对 main 函数传字符串参数(例如:命令行中:java OfficeBetter Excel,传给主函数的参数就是Excel,如果传多个参数,参数用空格隔开),Office类中使用了两个类(没有提供这两个类),并调用其相应的方法,然后进行编译报错,提示找不到这两个类,我们只提供了Word类和相应方法,并对它进行编译(这是因为只使用Word的功能),这时候再对Office这个类进行编译,这时候只报Excel找不到的错误,现在核心问题是只想使用Word,而不使用Excel这个类,但是报错(这样就不能运行,导致不能使用Word的功能),因为new 对象是静态加载类的方式,在编译时刻就需要加载所有可能使用到的类,但实际应用希望用到哪个类加载哪个类,这样就不会在编译时报错,并且可以运行,所以可以通过动态加载类来解决该问题,通过Class.forName(args[0])动态加载这个类的Class实例对象,通过传入一个类的路径,即使没有这个类,编译时刻也不会报错,但运行时刻会报错,紧接着就可以通过Office的类类型创建Word对象,如果强制转换为Excel类型,但是加载时却是Word类,就可能发生错误,这时就需要给Word和Excel指定一个标准,也就是创建一个接口,并声明相应方法,并且让Word和Excel实现这个接口,如果传入的参数是Excel,只需要再创建一个Excel并实现该接口,这样就不用在主程序中修改类型了,实际应用中功能类通常使用动态加载类。
查看全部 -
类是对象,类是java.lang.Class类的实例对象
Class类的实例对象表示方式:
1、隐含的静态成员变量class
Class c1=Foo.class;
2、类的getClass方法
Foo foo1=new Foo();
Class c1=foo1.getClass();
c1,c2表示了Foo类的类类型(class type)
不管c1,c2都代表了Foo类的类类型,一个类只可能是Class类的一个实例对象
3、Class.forName("类全名")
Class c3=Class.forName("com.Foo");
通过类类型创建该类的对象实例
Foo foo=(Foo) c1.newInstance();
注意:如果c1是A类的Class实例,则创建的是A类的对象,如果是B类的Class实例,则创建的是B类的对象,并且需要做强制类型转换。
默认需要该类有无参数的构造方法。
查看全部 -
方法反射的操作
查看全部 -
类的静态加载与动态加载
查看全部 -
成员变量的反射和构造函数的反射
知识点1:成员变量的反射
java.lang.reflect.Field:成员变量也是对象,Field类封装了关于成员变量的操作。
getFields():获取该类类型所有的public的成员变量信息,返回值为Field类型的数组。
getDeclaredFields():获取所有自己声明的成员变量信息(不区分访问修饰符的限制),返回值为Field类型的数组。
getType():获取成员变量类型的类类型,返回值类型为Class。
getName():如果是成员变量类型调用该方法,则返回该类型的名字,如果是成员变量调用该方法,则返回成员变量名字。
知识点2:构造函数的反射
java.lang.Constructor:构造函数也是对象,Constructor中封装了构造函数的信息。
getConstructors():类类型调用的方法,获取所有公有的构造方法,返回值类型为Constructor数组。
getDeclaredConstructors():类类型调用的方法,获取所有自己声明的构造方法(不区分访问修饰符),返回值类型为Constructor数组。
getName():Constructor类的方法,获取构造方法名(这里为类路径+构造方法名)。
getParameterTypes():Constructor对象的方法,获取构造函数的参数列表,得到的是参数列表的类类型,返回值为Class类型数组。
查看全部 -
今天的笔记
查看全部 -
静态成员、普通数据类型不是对象。类是java.lang.Class的对象。
任何一个类都是Class的实例对象,这个实例对象有三种表示方式
第一种表示方式 任何一个类都有一个隐含的静态成员变量class
Class c1=Foo.class;
第二种表达方式 已经知道该类的对象通过getClass方法
Class c2=foo1.getClass();
第三种表达方式
Class c3=null;
c3=Class.forName("路径 包.类名");
c1,c2,c3表示了Foo类的类类型(class type)
我们完全可以通过类的类类型创建该类的对象实例
Foo foo=(Foo)c1.newInstance();
查看全部 -
aaaaa
查看全部 -
new是静态加载类,在编译的时候把可能用到的类全都加载进来。
查看全部 -
java中集合的泛型,是防止错误输入的,只在编译阶段有效,绕过编译就无效了
总结:反射可以绕过编译
查看全部 -
方法的反射
Class c=a1.getClass()
获取方法
Method m=c.getDeclaredMethod(name,parameterTypes);
方法的反射操作
m.invoke(obj,args);
对于无参的方法
Method m2=c.getMethod("print");
m2.invoke(a1,new Object[]{});
查看全部 -
构造函数也是对象
java.lang.Constructor中封装了构造函数的信息
getConstructors获取所有的public的构造函数
getDeclaredConstuctors得到所有的构造函数
获取构造函数的参数列表 得到的是参数列表的类类型
Class[] paramTypes=constructor.getParameterTypes();
查看全部 -
成员变量也是对象
java.lang.reflect.Field
Field类封装了关于成员变量的操作
getFields()方法获取的是所有public的成员变量的信息
getDeclaredFields获取的是该类自己声明的成员变量的信息
得到成员变量的类型的类类型
Class fieldType=field.getType();
查看全部
举报