java反射

类描述

一个类在内存中只有一个一个Class对象
有一个User类,在程序中无论new了多少个User对象,但User对应的Class只有一个

作用
Class用来描述类本身
Package用来描述类所属的包
Field用来描述类中的属性
Method用来描述类中的方法
Constructor用来描述类的构造方法
Annotation用来描述类中的注解

获取Class

方法一. Class c=Class.forName(“包名.类名”);
方法二. Class c=类名.class;
方法三. Class c=对象.getClass();//Object中的方法

获取Class信息

public class Demo {
    public static void main(String[] args) {
        try {
            Class c=Class.forName("com.wwj.Person");

            //获取修饰符(用int类型表示不同的修饰符,有多个修饰符返回其修饰符的和)
            int modifiers = c.getModifiers();

            //获取类名
            String calssName=c.getName();//返回包名.类名
            String simpleName=c.getSimpleName();//返回类名

            //获取类所在的包
            Package p=c.getPackage();
            String pName=p.getName();

            //获取父类
            Class superClass = c.getSuperclass();
            while (superClass!=null){
                System.out.println(superClass.getName());
                superClass=superClass.getSuperclass();
            }

            //获得类实现的接口
            Class[] interfaces = c.getInterfaces();
            for(Class interfaceClass:interfaces)
                System.out.println(interfaceClass.getName());

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

创建类对象

public class Demo {
    public static void main(String[] args) {
        try {
            Class c=Class.forName("com.wwj.Person");

            //相当于调用Person类中的默认无参构造函数
            //,若类没有无参构造函数(无参构造函数被有参构造函数重写覆盖..)则报错
            Person p=(Person)c.newInstance();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Field类–> Class类中属性操作

public class Person{
    public String name;
    private int age;

    public String toString(){
        return "name:"+name+"   age:"+age;
    }
}
public class Demo {
    public static void main(String[] args) {
        try {
            Class c=Class.forName("com.wwj.Person");

            //获取所有属性(只能获得public,包括继承得来的)
            System.out.println("获取所有属性(只能获得public,包括继承得来的)");
            Field[] fields = c.getFields();
            for(Field f:fields)
                System.out.println(f.getName());
            //获得所有属性(全部,包括继承得来的)
            System.out.println("获得所有属性(全部,包括继承得来的)");
            Field[] declaredFields = c.getDeclaredFields();
            for(Field declaredf:declaredFields)
                System.out.println(declaredf.getName());

            //根据属性名获得类的属性(只能获得public)
            Field nameField=c.getField("name");
            //根据属性名获得类的属性(全部)
            //获取私有属性,若用getField会报NoSuchFieldException异常。
            // NoSuchFieldException异常原因:①没有对应字段;②属性为私有时获取Field用的方法不是getDeclaredField。
            Field ageField=c.getDeclaredField("age");

            //获取属性修饰符
            System.out.println("获取属性修饰符");
            int nameModifiers = nameField.getModifiers();
            int ageModifiers = ageField.getModifiers();
            System.out.println("nameModifiers:"+nameModifiers+"   ageModifiers:"+ageModifiers);

            //获得属性类型
            System.out.println("获取属性修饰符获得属性类型");
            Class nameType = nameField.getType();
            Class ageType = ageField.getType();
            System.out.println("nameType:"+nameType+"   ageType:"+ageType);

            //获取属性名字
            System.out.println("获取属性名字");
            String nameName = nameField.getName();
            String ageName = nameField.getName();
            System.out.println("nameName:"+nameName+"   ageName:"+ageName);


            Person person=(Person) c.newInstance();
            //对象赋值
            System.out.println("对象赋值");
            //私有属性赋值
            //值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。
            //值为 false 则指示反射的对象应该实施 Java 语言访问检查。
            ageField.setAccessible(true);//设为true才能对私有变量进行读取和赋值
            ageField.set(person,1);
            nameField.set(person,"wwj");
            System.out.println(person.toString());

            //对象取值
            System.out.println("对象取值");
            String getName=(String)nameField.get(person);
            int getAge=(int)ageField.get(person);
            System.out.println("getName:"+getName+"   getAge:"+getAge);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出

获取所有属性(只能获得public,包括继承得来的)
name
获得所有属性(全部,包括继承得来的)
name
age
获取属性修饰符
nameModifiers:1   ageModifiers:2
获取属性修饰符获得属性类型
nameType:class java.lang.String   ageType:int
获取属性名字
nameName:name   ageName:name
对象赋值
name:wwj   age:1
对象取值
getName:wwj   getAge:1

Method–> Class类中方法操作

public class Person{
    public String name;
    private int age;

    public void eat(){
        System.out.println("公共无参");
    }

    public String eat(String food){
        System.out.println("公共有参-带返回值");
        return "公共有参-带返回值-->food:"+food;
    }

    private void eatTwo(){
        System.out.println("私有无参");
    }

    private String eatTwo(String food){
        System.out.println("私有有参-带返回值");
        return "私有有参-带返回值-->food:"+food;

    }

    public String toString(){
        return "name:"+name+"   age:"+age;
    }
}
public class Demo {
    public static void main(String[] args) {
        try {
            Class aClass = Class.forName("com.wwj.Person");

            Person person=(Person)aClass.newInstance();


            /**
             * getMethod获得的方法包括父类中继承的方法,只能获得公有方法
             */
            //公共无参
            System.out.println("公共无参");

            Method publicEat=aClass.getMethod("eat");
            System.out.println("获得的方法:"+publicEat);
            int publicEatModifiers = publicEat.getModifiers();
            System.out.println("修饰符:"+publicEatModifiers);
            Class publicEatReturnType = publicEat.getReturnType();
            System.out.println("返回类型:"+publicEatReturnType);
            String publicEatName = publicEat.getName();
            System.out.println("方法名:"+publicEatName);
            Class[] publicEatNameParameterTypes = publicEat.getParameterTypes();
            System.out.println("参数列表类型:");
            for (Class c:publicEatNameParameterTypes)
                System.out.println("  "+c.getName());
            System.out.println("方法抛出的异常:");
            Class[] publicEatExceptionTypes = publicEat.getExceptionTypes();
            for (Class c:publicEatExceptionTypes)
                System.out.println("  "+c.getName());

            System.out.println("方法执行:");
            publicEat.invoke(person);
            System.out.println();

            //公共有参-带返回值
            System.out.println("公共有参-带返回值");
            Method publicEatTwo=aClass.getMethod("eat", String.class);
            System.out.println("获得的方法:"+publicEatTwo);
            int publicEatTwoModifiers = publicEatTwo.getModifiers();
            System.out.println("修饰符:"+publicEatTwoModifiers);
            Class publicEatTwoReturnType = publicEatTwo.getReturnType();
            System.out.println("返回类型:"+publicEatTwoReturnType);
            String publicEatTwoName = publicEatTwo.getName();
            System.out.println("方法名:"+publicEatTwoName);
            Class[] publicEatTwoNameParameterTypes = publicEatTwo.getParameterTypes();
            System.out.println("参数列表类型:");
            for (Class c:publicEatTwoNameParameterTypes)
                System.out.println("  "+c.getName());
            System.out.println("方法抛出的异常:");
            Class[] publicEatTwoExceptionTypes = publicEatTwo.getExceptionTypes();
            for (Class c:publicEatTwoExceptionTypes)
                System.out.println("  "+c.getName());

            System.out.println("方法执行:");
            String apple = (String) publicEatTwo.invoke(person, "apple");
            System.out.println("方法执行返回结果:"+apple);
            System.out.println();

            /**
             * getDeclaredMethod获得的方法不包括父类中继承的方法,能获得私有方法
             */
            //私有无参
            System.out.println("私有无参");
            Method privateEat=aClass.getDeclaredMethod("eatTwo");
            System.out.println("获得的方法:"+privateEat);
            int privateEatModifiers = privateEat.getModifiers();
            System.out.println("修饰符:"+privateEatModifiers);
            Class privateEatReturnType = privateEat.getReturnType();
            System.out.println("返回类型:"+privateEatReturnType);
            String privateEatName = privateEat.getName();
            System.out.println("方法名:"+privateEatName);
            Class[] privateEatNameParameterTypes = privateEat.getParameterTypes();
            System.out.println("参数列表类型:");
            for (Class c:privateEatNameParameterTypes)
                System.out.println("  "+c.getName());
            System.out.println("方法抛出的异常:");
            Class[] privateEatExceptionTypes = privateEat.getExceptionTypes();
            for (Class c:privateEatExceptionTypes)
                System.out.println("  "+c.getName());

            System.out.println("方法执行:");
            privateEat.setAccessible(true);//权限设定
            privateEat.invoke(person);
            System.out.println();

            //私有有参-带返回值
            System.out.println("私有有参-带返回值");
            Method privateEatTwo=aClass.getDeclaredMethod("eatTwo",String.class);
            System.out.println("获得的方法:"+privateEatTwo);
            int privateEatTwoModifiers = privateEatTwo.getModifiers();
            System.out.println("修饰符:"+privateEatTwoModifiers);
            Class privateEatTwoReturnType = privateEatTwo.getReturnType();
            System.out.println("返回类型:"+privateEatTwoReturnType);
            String privateEatTwoName = privateEatTwo.getName();
            System.out.println("方法名:"+privateEatTwoName);
            Class[] privateEatTwoNameParameterTypes = privateEatTwo.getParameterTypes();
            System.out.println("参数列表类型:");
            for (Class c:privateEatTwoNameParameterTypes)
                System.out.println("  "+c.getName());
            System.out.println("方法抛出的异常:");
            Class[] privateEatTwoExceptionTypes = privateEatTwo.getExceptionTypes();
            for (Class c:privateEatTwoExceptionTypes)
                System.out.println("  "+c.getName());

            System.out.println("方法执行:");
            privateEatTwo.setAccessible(true);//权限设定
            String banana = (String) privateEatTwo.invoke(person, "banana");
            System.out.println("方法执行返回结果:"+banana);
            System.out.println();


        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出

公共无参
获得的方法:public void com.wwj.Person.eat()
修饰符:1
返回类型:void
方法名:eat
参数列表类型:
方法抛出的异常:
方法执行:
公共无参

公共有参-带返回值
获得的方法:public java.lang.String com.wwj.Person.eat(java.lang.String)
修饰符:1
返回类型:class java.lang.String
方法名:eat
参数列表类型:
  java.lang.String
方法抛出的异常:
方法执行:
公共有参-带返回值
方法执行返回结果:公共有参-带返回值-->food:apple

私有无参
获得的方法:private void com.wwj.Person.eatTwo()
修饰符:2
返回类型:void
方法名:eatTwo
参数列表类型:
方法抛出的异常:
方法执行:
私有无参

私有有参-带返回值
获得的方法:private java.lang.String com.wwj.Person.eatTwo(java.lang.String)
修饰符:2
返回类型:class java.lang.String
方法名:eatTwo
参数列表类型:
  java.lang.String
方法抛出的异常:
方法执行:
私有有参-带返回值
方法执行返回结果:私有有参-带返回值-->food:banana

Constructor–> Class类中的构造方法

public class Person{
    public String name;
    private int age;

//    public Person(){
//        System.out.println("我是公有无参构造函数");
//    }

//    private Person(){
//        System.out.println("我是私有无参构造函数");
//    }

//    public Person(String name,int age){
//        System.out.println("我是公有有参构造函数 name="+name+"   age="+age);
//    }

    private Person(String name,int age){
        System.out.println("我是私有有参构造函数 name="+name+"   age="+age);
    }
}
public class Demo {
    public static void main(String[] args) {
        try {
            Class aClass = Class.forName("com.wwj.Person");

            /**
             * 一:调用无参构造函数,若不存在则报错(公有)
             */
//            Person person=(Person)aClass.newInstance();

            /**
             * 二:调用getConstructor
             */
            //获得无参构造器(公有)
//            Constructor publicConstructor=aClass.getConstructor();
//            //执行构造器
//            Person person2= (Person) publicConstructor.newInstance();
//
//            //获得无参构造器(私有)
//            Constructor privateConstructor=aClass.getDeclaredConstructor();
//            privateConstructor.setAccessible(true);//权限设置
//            Person person3= (Person) privateConstructor.newInstance();

            //获得有参构造器(公有)
//            Constructor publicConstructorWithParameter=aClass.getConstructor(String.class,int.class);
//            Person person4= (Person) publicConstructorWithParameter.newInstance("name",1);

            //获得有参构造器(私有)
            Constructor privateConstructorWithParameter=aClass.getDeclaredConstructor(String.class,int.class);
            privateConstructorWithParameter.setAccessible(true);//权限设置
            Person person5= (Person) privateConstructorWithParameter.newInstance("name",1);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值