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);
        }
    }
  • 相关阅读:
    J2EE技术(一)——JNDI
    软考注定是一次伤痛
    Ultraedit使用技巧收集
    ArcGIS Server Java 自定义Functionality(转)
    用C#动态刷新KML
    ArcGIS Server Java 自定义task
    Python动态刷新kml
    投影坐标知识小结
    tomcat配置数据源通过JNDI访问mysql数据库
    ArcGIS Server Java自定义tool
  • 原文地址:https://www.cnblogs.com/cathycheng/p/13209300.html
Copyright © 2011-2022 走看看