创建反射的三种方式
1.Class c1=Username.class
2.Class c2=use.getClass()
3.Class c3 = Class.forName("class Demo.java3.反射.Username")
4.ClassLoader loa = Username.class.getClassLoader()
Class c4=loa.loadClass("class Demo.java3.反射.Username")
获取所有属性的类型以及修饰符:
1.Field[] fields = c1.getFields()
2.Field[] fields1 = c1.getDeclaredFields()
权限修饰符.数据.类型:
Field[] fields = clazz.getDeclaredFields()
for(Field f:fields){ //for循环
int i = f.getModifiers()
String s = Modifier.toString(i)
Class type=f.getType() //数据类型
String name = f.getName()
}
获取所有方法名:
Method[] methods1 = c1.getDeclaredMethods()
获取:@注解 权限修饰符.方法名(参数类型1,形参名1).返回值类型
Method[] methods = c1.getDeclaredMethods()
<for(Method m1:methods){
Annotation[] annotations = m1.getAnnotations()
<for (Annotation a1:annotations){
System.out.println("获取到的注解:"+a1)
}
System.out.println( "权限修饰符"+Modifier.toString (m1.getModifiers())+" "
+"返回值类型:"+m1.getReturnType().getName()+" "
+"方法名:"+m1.getName()//方法名
)
Class[] types = m1.getParameterTypes()
for (Class c:types){
ystem.out.print("形参:"+c.getName())
}
/* 返回:
形参:(形参:java.lang.String)
权限修饰符public 返回值类型:int
方法名:compareTo (形参:java.lang.String)
获取到的注解:@Demo.java3.反射.MyAnnotation(value="hello")
}//结束循环
获取抛出的异常:
Class[] ex= m1.getExceptionTypes()
if(ex!=null&&ex.length!=0) //如果为0或者为空就是啥也没有
{
for(int i=0
{
System.out.print(" "+"抛出的异常:"+ex[i].getName())
}
/*
抛出的异常:java.lang.Exception
*/
}
构造器(公有和所有的权限修饰符构造器):
Constructor[] cs=c1.getConstructors()
Constructor[] cs1=c1.getDeclaredConstructors()
//返回为:private Demo.java3.反射.Person1(java.lang.String,int)
获取运行时代泛型的父类的泛型:
Type type1 = c1.getGenericSuperclass()
ParameterizedType theorized= (ParameterizedType) type1
Type[] Actual = theorized.getActualTypeArguments()
/*
不带泛型的父类:class Demo.java3.反射.Creature
获取时带泛型的父类:Demo.java3.反射.Creature<java.lang.String>
运行时代泛型的父类的泛型:class java.lang.String
*/
获取运行时的父类:
Class aClass = c1.getSuperclass()
获取运行时带泛型的父类(会用到):
Type type = c1.getGenericSuperclass()
获取运行时类的接口(会用到):
Class[] interfaces = cs.getInterfaces()
Class[] interfaces1 = cs.getSuperclass().getInterfaces()
获取运行时类所在的包位置:
Package aPackage = cs.getPackage()
/*
运行时所在的包位置: package Demo.java3.反射
*/
获取运行时类的注解:
Annotation[] annotations = cs.getAnnotations()
/*
运行时类的注解:@Demo.java3.反射. MyAnnotation(value="我是运行时类的注解")
*/
<--如何调用/获取 运行时类的(属性)(方法)(构造器)
获取指定的属性(支持私有)(修改.查看):
Person1 obj = (Person1)cs.newInstance()
Field name = cs.getDeclaredField("name")
name.setAccessible(true)
name.set(instance,"你好")
Object o = name.get(instance)
使用方法(支持私有):
bject o = cs.newInstance()
Method show = cs.getDeclaredMethod("show", String.class)
show.setAccessible(true)
Object o1 = show.invoke(o, "我是中国人")
// invok 是调用里面的方法 第一个是类构造器,第二个是参数,如果有返回值就可以接收
调用构造器带参数的构造器(不通用): 一般使用不带参数的因为不适合
Constructor constructor = cs.getDeclaredConstructor(String.class)
constructor.setAccessible(true)
Person1 instance = (Person1)constructor.newInstance("我爱我的国家 传输进去构造器的值")
System.out.println(instance.toString())