反射的所有函数以及使用方法

创建反射的三种方式;
   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();//获取所有的public属性(继承了父类还会找父类的所有属性)
2.Field[] fields1 = c1.getDeclaredFields();//返回该类的所有属性(包括private属性的) 但不包含父类的属性

权限修饰符.数据.类型:
Field[] fields = clazz.getDeclaredFields(); //返回该类的所有属性(包括private属性的) 但不包含父类的属性
 for(Field f:fields){  //for循环
int i = f.getModifiers(); //输出0,1,2,3,4这样子的 //权限修饰符
String s = Modifier.toString(i);转换回来成普通类型的  //private   public
Class type=f.getType()  //数据类型
String name = f.getName(); //返回: name,age,id  变量名称
}

获取所有方法名:
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()//方法名
                    );//获取所有的方法的(public private)等权限修饰符  加返回值类型 方法名

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;i<ex.length;i++)
    {
     System.out.print(" "+"抛出的异常:"+ex[i].getName());//抛出异常
    }
        /*
        抛出的异常:java.lang.Exception
         */
 }

构造器(公有和所有的权限修饰符构造器):
Constructor[] cs=c1.getConstructors(); //获取当前运行时类中声明为public的构造器
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); //必须得实现为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());//输出属性有没有发生改变
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游迹AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值