zoukankan      html  css  js  c++  java
  • java学习日记 反射机制

    1、认识class类

    1)产生了实例化对象

    import java.util.Date;
    
    public class GetClassDemo1 {
        public static void main(String[] args) {
            Date date = new Date();
            Class<?> cls = date.getClass();
            System.out.println(cls);
        }
    }

    2)未产生实例化对象

    import java.util.Date;
    
    public class GetClassDemo1 {
        public static void main(String[] args) {
            Class<?> cls = Date.class;
            System.out.println(cls);
        }
    }

    3)调用class类的方法,不用import语句导入明确的类,采用forname方法描述类名称。

    public class GetClassDemo1 {
        public static void main(String[] args) throws ClassNotFoundException {
            Class<?> cls = Class.forName("java.util.Date");
            System.out.println(cls);
        }
    }

    运行结果相同:

    class java.util.Date

     2、对象实例化

    class BookObject{
        public BookObject(){
            System.out.println("***无参构造***");
        }
    
        @Override
        public String toString() {
            return "这是一个例子";
        }
    }
    public class GetClassDemo1 {
        public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
            Class<?> cls = Class.forName("com.hengqin.test1.BookObject");
            Object obj = cls.newInstance();
            System.out.println(obj);
        }
    }
    interface IFruit{
        public void eat();
    }
    
    class Appl implements IFruit{
    
        @Override
        public void eat() {
            System.out.println("***吃苹果***");
        }
    }
    
    class Factory2{
        public static IFruit getInstance(String classname){
            IFruit f = null;
            try {
                f = (IFruit) Class.forName(classname).newInstance();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            return f;
        }
    }
    public class FactorRegexDemo1 {
        public static void main(String[] args) {
            IFruit f = Factory2.getInstance("com.hengqin.test1.Appl");
            f.eat();
        }
    }

    3、使用反射调用构造(明确调用类中的有参构造)

    import java.lang.reflect.Constructor;
    
    public class GetConstructDemo1 {
        public static void main(String[] args) throws Exception {
            Class<?> cls = Class.forName("com.hengqin.test1.Book");
            Constructor<?> con = cls.getConstructor(String.class,double.class);
            Object obj = con.newInstance("java",89.7);
            System.out.println(obj);
        }
    }

    4、反射调用方法

    public class GetConstructDemo1 {
        public static void main(String[] args) throws Exception {
            String filename = "title";
            Class<?> cls = Class.forName("com.hengqin.test1.Book1");
            Object obj = cls.newInstance();
            Method setMet = cls.getMethod("set"+initcap(filename), String.class);
            Method getMet = cls.getMethod("get"+initcap(filename));
            setMet.invoke(obj,"java");
            System.out.println(getMet.invoke(obj));
        }
        public static String initcap(String str){
            return str.substring(0,1).toUpperCase()+str.substring(1);
        }
    }
  • 相关阅读:
    设计模式13---设计模式之观察者模式(Observer)(行为型)
    codeforces 166C Median
    HDU 1176 免费馅饼
    老鸟的Python新手教程
    setsockopt()使用方法(參数具体说明)
    RelativeLayout经常使用属性介绍
    java多线程模拟生产者消费者问题,公司面试常常问的题。。。
    JAVA实现HTTPserver端
    进程间通信_03命名管道
    expdp&amp;impdp
  • 原文地址:https://www.cnblogs.com/cathycheng/p/13209300.html
Copyright © 2011-2022 走看看