Java中的反射(2)

使用当前类测试反射机制
package reflect;

public class Person{
    private String name = "张三";
    private int age = 20;
    
    public Person(){} //无参构造
    public Person(String name,int age){ //有参构造
        super();
        this.name = name;
        this.age = age;
    }
    public void sayHello(){
        System.out.println(str+":"+str); //输出:大家好!:大家好!
    }
    public void say(String str,int age){
        System.out.println("大家好,我是"+str+",今年"+age+"岁"); //大家好,我是张三,今年30岁
    }
    
    //重写toString();为了方便看对象的属性值而不是地址值
    @Override
    public String toString(){
        return "Person[name=" + name + ",age=" + age + "]";
    }
    private void dosome(){
        System.out.println("Person:我是私有方法!!!")
    }
}
package reflect;

import java.lang.reflect.Method;

public class ReflectDemo{
    public static void main(String[] args){
        Person p = new Person();
        p.sayHello("大家好!");
        p.say("张三",30);
        
        Class cls = Class,forName("reflect.Person");
        Object o = cls.newInstance();
        
        //sayHello(String)
        Method m = cls.getMethod("sayHello",String.class);
        m.invoke(o,"哈喽~~");
        
        Method m1 = cls.getMethod("say",String.class);
        m1.invoke(o,"李四"22);
    }
}
Java反射机制
反射式一种动态机制,允许我们实例化对象、调用方法、操作属性从编码期间确定转移到程序运行期间确定。因此反射提高了程序的灵活性,但是随之带来的是更多的系统开销和较慢的运行效率。因此反射机制不能过度使用
package reflect;

import java.lang.reflect.Method;
import java.util.Scanner;

public class ReflectDemo1{
    public static void main(String[] args){
        /*
        反射第一步,获取要利用反射操作的类的类对象
        Class类的实例
        JVM中每个被加载的类都有且只有一个Class实例与之对应,通过类对象(Class的实例)我们可以得知其  表示的类的一切信息:
        例如:类名,有哪些属性,哪些方法,哪些构造器等等,并利用这些在程序运行期间操作他们。
        
        获取一个类的类对象有三种方式:
        1、类名.class
           例如:
           Class cls = String.class;
           Class cls = int.class;
        2、Class.forName(String className)
           例如:
           Class cls = Class.forName("java.lang.String");
           这里的forName方法中传入的是类的完全限定名
           包名.类名
        3、类的加载器ClassLoader进行加载并获取
        */
         //优点:简单直接   缺点:硬编码获取,不灵活
           Class cls = String.class;
           Class cls1 = int.class
        //Class.forName()
        try{
            //Class cls = Class.forName("java.io.OutputStream"); //写死了,不灵活
            Scanner scan = new Scanner(System.in);
            System.out.println("请输入一个类名:");
            String className = scan.nextLine();
            Class cls = Class.forName(className);
            
            //获取String中的所有公开方法
            Method[] methods = cls.getDeclaredMethods();
            for(Method method : methods){
                System.out.println(method.getName);
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
利用反射实例化操作
package reflect;

public class RedlectDemo2{
    public static void main(String[] args){
        //new关键字
        Person p = new Person();
        System.out.println(p); //输出:Person [name=张三, age=22]
        
        //利用反射实例化
        //1、加载类的类对象
        Class cls = Class.forName("refiect.Person");
        //2、利用Class方法newInstance实例化
        Object o = cls.newInstance(); //必须有无参构造
        System.out.println(o); //输出:Person [name=张三, age=22]
    }
}
通过指定的构造器实例化对象
package reflect;

import java.lang.reflect.Constructor;

public class ReflectDemo3{
    public static void main(String[] args) throws Exception{
        Person p = new Person();
        System.out.println(p);
        
        Person p1 = new Person("李四",22);
        System.out.println(p1);
        
        Class<?> cls = Class.forName("reflect.Person");
        //获取构造器
        Constructor<?> c = cls.getConstructor();
        //利用该构造器实例化对象
        Object o = c.newInstance();
        System.out.println(o);
        
        //利用Person(String,int)
        Constructor<?> c2 = cls.getConstructor(String.class,int.class);
        //实例化
        Object o 2 = c2.newInstance("小明",50);
        System.out.println(o2);
    }
}
使用反射机制调用方法
package reflect;

import java.lang.reflect.Method;
import java.util.Scanner;

public class ReflectDemo4{
    public static void main(String[] args) throws Exception{
        Person p = new Person();
        p.sayHello();
        
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入类名:");
        String className = scan.nextLine();
        System.out.println("请输入方法名:");
        String methodName = scan.nextLine();
        
        //实例化
        Class c = Class.forName(className);
        m.invoke(o); //o.sayHello();
    }
}
利用反射调用私有方法
package reflect;

import java.lang.reflect.Method;

public class ReflectDemo5{
    public static void main(String[] args){
        Person p = new Person();
        //p.dosome; //编译不通过
        
        Class cls = Class.forName("reflect.Person");
        Object o = cls.newInstance();
        //获取Person中的私有方法dosome
        Method m = cls.getDeclaredMethod("dosome");
        m.setAccessible(true);//打破封装
        m.invoke(o);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值