Reflect(反射笔记整理)

java反射机制:

反射机制是一个动态机制,它允许我们程序在[运行期间]再确定实例化,方法的调用,属性的操作等。

由此可知:
1)反射的优点可以使程序的灵活度大大提高;

2)随之而来的缺点便是增加了系统的开销降低了运行效率。

因此,反射机制不能被过渡使用

Demo1

使用反射机制的第一步:获取要操作的类对象,即:Class的实例。

JVM中被加载的类都有且只有一个Class的实例与之对应,该实例就称为被加载的这个类的类对象。

类对象上会记录着其表示的类的一切信息(类名,方法信息,属性信息等)

获取一个类的类对象方式:

1:类名.class:

//Class cls = String.class;

Class cls = int.class;

2:Class.forName(String className)

Class cls = Class.forName("java.lang.String");

参数要求是要加载的类的完全限定名:包名+类名

3.类加载器ClassLoader形式加载

public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个类名:");
        String className = scanner.nextLine();
        Class cls = Class.forName(className);

        //通过类对象获取String的一切信息
        System.out.println(cls.getName());//获取类名
        System.out.println(cls.getSimpleName());//查看类名
        Package p = cls.getPackage();//获取该类的包名
        System.out.println("包名:"+p.getName());

        /*
        Class称为类对象,其每一个实例用于表示一个类的信息
        Method称为方法对象,其每一个实例用于表示一个方法的信息
        通过Method可以:
        获取一个方法的所有信息(方法名,参数信息,返回值类型,访问修饰符等),可以通过对象执行这个方法。
         */
        Method[] methods = cls.getMethods();
        for(Method method:methods){
            System.out.println(method.getName());
        }

    }
}

控制台部分结果展示:

Demo2

使用反射机制实例化对象:

反射机制实例化对象
1:加载要实例化对象的类的类对象
2:利用类对象来实例化
public class ReflectDemo2 {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        Person p = new Person();
        System.out.println(p);

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个类名:");
        String className = scanner.nextLine();
        Class cls = Class.forName(className);
        Object obj = cls.newInstance();
        System.out.println(obj);
    }
}

结果展示:

 Demo3

使用指定构造器实例化对象

为了方便演示,我们需要创建一个Person类

package reflect;

public class Person {
    private String name = "张三";
    private int age = 18;

    public Person(){}

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void sayHello(){
        System.out.println(name+"说:hello!");
    }
    public void watchTV(){
        System.out.println(name+":正在看电视");
    }
    public void sing(){
        System.out.println(name+":正在唱歌");
    }
    public void playGame(){
        System.out.println(name+":正在打游戏");
    }
    public void eat(){
        System.out.println(name+":正在干饭!");
    }
    public void say(String info){
        System.out.println(name+"说:"+info);
    }
    public void say(String info,int count){
        for(int i=1;i<=count;i++) {
            System.out.println(name + "第"+i+"次说:" + info);
        }
    }
    private void heihei(){
        System.out.println("我是Person的私有方法!!!!!!");
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
public class ReflectDemo3 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        Person p = new Person("李四",22);
        System.out.println(p);

        Class cls = Class.forName("reflect.Person");
//        cls.getConstructor();//不传参数时,获取的就是无参构造器
        /*
            Constructor对象的每一个实例用于表示一个构造器
         */
        //Person(String,int)
        Constructor c = cls.getConstructor(String.class,int.class);
        //new Person("王五",33);
        Object obj = c.newInstance("王五",33);
        System.out.println(obj);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值