zoukankan      html  css  js  c++  java
  • 16 反射,枚举,新特性

    import com.fly.bean.Person;
    
    public class Demo1_Reflect {
    
        public static void main(String[] args) throws ClassNotFoundException {
            //反射
            Class class1 = Class.forName("com.fly.bean.Person");
            Class class2 = Person.class;
            
            Person person = new Person();
            Class class3 = person.getClass();
            
            System.out.println(class1==class2);
            System.out.println(class2==class3);
        }
    
    }
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    
    public class Demo2_Reflect {
        //Class.forName读取文件
        public static void main(String[] args) throws Exception {
            X x = new X();
            x.run(new A1());
            
            BufferedReader br = new BufferedReader(new FileReader
    
    ("config.properties")); //com.fly.reflect.A1
            Class class1 = Class.forName(br.readLine());
            A a = (A) class1.newInstance();
            x.run(a);
        }
    
    }
    interface A{
        public void method();
    }
    
    class A1 implements A{
        
        @Override
        public void method() {
            System.out.println("A1");
        }
        
    }
    
    class A2 implements A{
        
        @Override
        public void method() {
            System.out.println("A2");
        }
        
    }
    
    class X{
        public void run(A a) {
            a.method();
        }
    }



    import java.lang.reflect.Constructor;
    
    import com.fly.bean.Person;
    
    public class Demo3_Constructor {
        /**
         * Class类的newInstance()方法是使用该类无参的构造函数创建对象, 如果一个类没有无参的
    
    构造函数,
         * 就不能这样创建了,可以调用Class类的getConstructor
         * (String.class,int.class)方法获取一个指定的构造函数然后再调用Constructor类的
    
    newInstance
         */
        public static void main(String[] args) throws Exception {
            Class class1 = Class.forName("com.fly.bean.Person");
            Constructor c = class1.getConstructor(String.class,int.class);//获取有参构
    
    造
            Person p = (Person) c.newInstance("zhang",23);//通过有参构造创建对象
            System.out.println(p);
        }
    
    }
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    
    import com.fly.bean.Person;
    
    public class Demo4_Field {
        /**
         * Class.getField(String)方法可以获取类中的指定字段(可见的),
         * 如果是私有的可以用getDeclaedField("name")方法获取,通过set(obj, "李四")方法可以设
    
    置指定对象上该字段的值,
         * 如果是私有的需要先调用setAccessible(true)设置访问权限,用获取的指定的字段调用get
    
    (obj)可以获取指定对象中该字段的值
         * @throws Exception
        */
        public static void main(String[] args) throws Exception {
            Class class1 = Class.forName("com.fly.bean.Person");
            Constructor c = class1.getConstructor(String.class,int.class);//获取有参构
    
    造
            
            Person person = (Person) c.newInstance("zhang",21);//通过有参构造创建对象
            Field field = class1.getDeclaredField("name");//暴力反射获取字段
            field.setAccessible(true);//去除私有权限
            field.set(person, "zhao");
            System.out.println(person);
        }
    
    }



    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
    
    import com.fly.bean.Person;
    
    public class Demo5_Method {
    
        /**
         * Class.getMethod(String, Class...) 和 Class.getDeclaredMethod(String,
         * Class...)方法可以获取类中的指定方法,调用invoke(Object,
         * Object...)可以调用该方法,Class.getMethod("eat") invoke(obj)
         * Class.getMethod("eat",int.class) invoke(obj,10)
         * @throws Exception
         */
        public static void main(String[] args) throws Exception {
            Class class1 = Class.forName("com.fly.bean.Person");
            Constructor c = class1.getConstructor(String.class,int.class);//获取有参构
    
    造
            Person person = (Person) c.newInstance("zhang",21);//通过有参构造创建对象
        
            Method m = class1.getMethod("eat"); //获取eat方法
            m.invoke(person);
            
            Method m2 = class1.getMethod("eat", int.class);//获取有参的eat方法
            m2.invoke(person, 4);
        }
    
    }
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    
    public class Test1 {
    
        /**
         * @param args
         * ArrayList<Integer>的一个对象,在这个集合中添加一个字符串数据,如何实现呢?
         * 泛型只在编译期有效,在运行期会被擦除掉
         * @throws Exception
         */
        public static void main(String[] args) throws Exception {
            ArrayList<Integer> list = new ArrayList<>();
            list.add(111);
            list.add(222);
            
            Class clazz = Class.forName("java.util.ArrayList");                
    
    //获取字节码对象
            Method m = clazz.getMethod("add", Object.class);                
    
    //获取add方法
            m.invoke(list, "abc");
            
            System.out.println(list);
            
        }
    
    }
    import java.lang.reflect.Field;
    
    public class Tool {
        //此方法可将obj对象中名为propertyName的属性的值设置为value。
        public void setProperty(Object obj, String propertyName, Object value) throws
    
    Exception {
            Class clazz = obj.getClass();                    //获取字节
    
    码对象
            Field f = clazz.getDeclaredField(propertyName);    //暴力反射获取字段
            f.setAccessible(true);                            //
    
    去除权限
            f.set(obj, value);
        }
    }




    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class Test1 {
    
        public static void main(String[] args) {
            //动态代理
            MyStudent student = new MyStudent();
            student.A();
            student.B();
            
            MyStudent student2 = new MyStudent();
            MyInvocationHandler m = new MyInvocationHandler(student2);
            Student s = (Student) Proxy.newProxyInstance(student2.getClass
    
    ().getClassLoader(), student2.getClass().getInterfaces(), m);
            s.A();
            s.B();
            
        /*    aaa
            bbb
            校验
            aaa
            清理
            校验
            bbb
            清理*/
    
        }
    
    }
    
    interface Student{
        public void A();
        public void B();
    }
    class MyStudent implements Student{
    
        @Override
        public void A() {
            System.out.println("aaa");
            
        }
    
        @Override
        public void B() {
            System.out.println("bbb");
        }
        
    }
    /*
     * public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,
     * InvocationHandler h)
     */
    class MyInvocationHandler implements InvocationHandler{
        private Object target;
        public MyInvocationHandler(Object target) {
            this.target = target;
        }
        
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("校验");
            method.invoke(target, args);//执行被代理target对象的方法
            System.out.println("清理");
            return null;
        }
        
    }



    模板设计模式:

    示例:
    //计算程序运行的时间:
    abstract class GetTime {
        public final long getTime() {
            long start = System.currentTimeMillis();
            code();
            long end = System.currentTimeMillis();
            return end - start;
        }
    
        public abstract void code();
    }

    枚举:
    自定义枚举类:

    方式1:
    public class Week {
        
        public static final Week MON = new Week();
        public static final Week TUE = new Week();
        public static final Week WED = new Week();
        
        private Week(){}                        //私有构造,不让其他
    
    类创建本类对象
    }
    
    方式2:
    
    public class Week2 {
        
        public static final Week2 MON = new Week2("星期一");
        public static final Week2 TUE = new Week2("星期二");
        public static final Week2 WED = new Week2("星期三");
        
        private String name;
        private Week2(String name){
            this.name = name;
        }                        //私有构造,不让其他类创建本类对象
        public String getName() {
            return name;
        }
        
    }
    
    
    方式3:
    public abstract class Week3 {
        
        public static final Week3 MON = new Week3("星期一") {
            public void show() {
                System.out.println("星期一");
            }
        };
        public static final Week3 TUE = new Week3("星期二"){
            public void show() {
                System.out.println("星期二");
            }
        };
        public static final Week3 WED = new Week3("星期三"){
            public void show() {
                System.out.println("星期三");
            }
        };
        
        private String name;
        private Week3(String name){
            this.name = name;
        }                        //私有构造,不让其他类创建本类对象
        public String getName() {
            return name;
        }
        
        public abstract void show();
    }


    使用enum:

    方式1:
    public enum Week {
        MON,TUE,WED;
    }
    
    方式2:
    public enum Week2 {
        MON("星期一"),TUE("星期二"),WED("星期三");//必须放在第一行
        
        private String name;
        private Week2(String name) {
            this.name = name;
        }
        public String getName() {
            return name;
        }
        
        public String toString() {
            return name;
        }
    }
    
    
    方式3:
    public enum Week3 {
        MON("星期一"){
            public void show() {
                System.out.println("星期一");
            }
        },TUE("星期二"){
            public void show() {
                System.out.println("星期二");
            }
        },WED("星期三"){
            public void show() {
                System.out.println("星期三");
            }
        };
        
        private String name;
        private Week3(String name) {
            this.name = name;
        }
        public String getName() {
            return name;
        }
        
        public abstract void show();
        
    }
    //在switch上的应用:
    Week3 mon = Week3.TUE;
            switch (mon) {
            case MON:
                System.out.println("星期一");
                break;
            case TUE:
                System.out.println("星期二");
                break;
            }



    public class Demo2_Enum {
    
        /**
         * int ordinal()
        * int compareTo(E o)
        * String name()
        * String toString()
        * <T> T valueOf(Class<T> type,String name)
        * values()
        * 此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值
    
    非常方便
         */
        public static void main(String[] args) {
            //demo1();
    //        Week2 mon = Week2.valueOf(Week2.class, "MON");        //通过字节码对象获
    
    取枚举项
    //        System.out.println(mon);
            
            Week2[] arr = Week2.values();
            for (Week2 week2 : arr) {
                System.out.println(week2);
            }
        }
    
        public static void demo1() {
            Week2 mon = Week2.MON;
            Week2 tue = Week2.TUE;
            Week2 wed = Week2.WED;
            
            /*System.out.println(mon.ordinal());                //枚举项都
    
    是有编号的
            System.out.println(tue.ordinal());
            System.out.println(wed.ordinal());
            
            System.out.println(mon.compareTo(tue));            //比较的是编号
            System.out.println(mon.compareTo(wed));*/
            
            System.out.println(mon.name());                 //获取实例
    
    名称
            System.out.println(mon.toString());             //调用toString方法
        }
    
    }

    新特性:

    public class Demo1_JDK7 {
    
        /**
             * A:二进制字面量
            * B:数字字面量可以出现下划线
            * C:switch 语句可以用字符串
            * D:泛型简化,菱形泛型
            * E:异常的多个catch合并,每个异常用或|
            * F:try-with-resources 语句,1.7版标准的异常处理代码,关流
            *
            * 100_000
         */
        public static void main(String[] args) {
            System.out.println(0b110);
            System.out.println(100_000);//100000
        }
    
    }
    public class Test2 {
    
        public static void main(String[] args) {
            //1.8新特性
            //接口中可以定义有方法体的方法,如果是非静态的,必须用default修饰
            Inner.method();
            DA da = new DA();
            da.name();
            da.run();
        }
    
    }
    interface Inner{
        public default void name() {
            System.out.println("name");
        }
        public static void method() {
            System.out.println("method");
        }
        
    }
    class DA implements Inner{
        public void run() {
            final int num = 1; //final可以省略
            class In{
                public void f() {
    //                nun = 3; //直接报错
                    System.out.println(num);
                }
            }
            In in = new In();
            in.f();
        }
    }
  • 相关阅读:
    编译器内置宏实现调试信息输出
    走进C标准库(4)——"stdio.h"中的putc
    走进C标准库(5)——"stdio.h"中的其他部分函数
    走进C标准库(2)——"stdio.h"中的fopen函数
    [转]深度探索C语言函数可变长参数
    C语言I博客作业02
    C语言I博客作业02
    第一周c语音作业
    什么是模块化,模块化的好处又是什么?
    服务端渲染和客户端渲染
  • 原文地址:https://www.cnblogs.com/fly-book/p/9897486.html
Copyright © 2011-2022 走看看