A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

反射部分案例总结

1.基本概念
        A:反射
                反射就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法
        B:Class类
                成员变量                Field
                构造方法                Constructor
                成员方法                Method
        C:获取class文件对象的方式
                Object类的getClass()方法
                数据类型的静态属性class
                Class类中的静态方法
                        public static Class forName(String className)
                注意:开发中一般选用第三种,因为第三种需要的参数是字符串,字符串可以方便的配置到配置文件中       
       
2.获取Class文件的三种方式
        A:
                Person p = new Person();
                Class c1 = p.getClass();
        B:
                Class c2 = Person.class;
        C:
                Class c3 = Class.forName("cn.itcast_01.Person");
               
3.获取构造方法并使用
        A:常用功能
        public Constructor[] getConstructors():获取所有公共构造方法
        public Constructor[] getDeclaredConstructors():获取所有构造方法
        public Constructor<T> getConstructor(Class<?>...parameterTypes):获取单个构造方法
                参数表示的是:要获取的构造方法的构造参数个数及数据类型的class字节码文件对象
                返回值:字节码文件对象
        setAccessible(true)         反射对象使用时取消Java语言检查(用于使用私有属性的东西)
        public T newInstance(Object...Initargs):通过带参构造方法对象创建对象
       
        B:代码演示
        public class ReflectDemo{
                public static void main(String[] args) rhrows Exception{
                        //获取字节码文件对象
                        Class c = Class.forName("cn.incast_01.Person");
                        //获取公共带参构造方法
                        Constructor con1 = c.getConstructor(String.class,int.class,String.class);
                        //通过公共带参构造方法创建对象
                        Object obj1 = con1.newInstance("小明",20,"北京");
                        System.out.println(obj1);
                       
                        //获取私有带参构造方法
                        Constructor con2 = c.getDeclaredConstructor(String.class);
                        //设置取消访问检查
                        con2.setAccessible(true);
                        //用私有带参构造方法创建对象
                        Object obj2 = con2.newInstance("荆轲");
                        System.out.println(obj2);
                }
        }
       
4.获取成员变量并使用
        A:常用功能
        Field getField(String name):根据指定名称获取指定公共成员变量的Field对象
        Field[] getFields():获取公共成员变量的Field数组
        Field getDeclaredField(String name) :根据一定名称获取指定任意成员变量的Field对象
        Field[] getDeclaredFields() :获取所有成员变量的Field数组
        public void set(Object obj,Object value):将指定对象变量上此 Field 对象表示的字段设置为指定的新值。

        B:代码演示
        public class ReflectDemo{
                public static void main(String[] args) throws Exception{
                        //获取字节码文件对象
                        Class c = Class.forName("cn.itcast_01.Person");
                        //通过无参构造方法创建对象
                        Constructor con = c.getConstructor();
                        Object obj = con.newInstance();
                        //获取公共成员变量并赋值
                        Field addressField = c.getField("address");
                        addressField.set(obj,"北京");
                        System.out.println(obj);
                        //获取私有成员变量并赋值
                        Field nameField = c.getDeclareField("name");
                        nameField.setAccessible(true);
                        nameField.set(obj,"扶苏");
                        System.out.println(obj);
                }
        }       
       
5.获取成员方法并使用
        A:常用功能
        Method getMethod(String name, Class<?>... parameterTypes):获取自己包括父类的任一公共方法
        Method[] getMethods():返回自己包括父类的所有公共方法的Method数组
        Method getDeclaredMethod(String name, Class<?>... parameterTypes):获取自己的任一方法
        Method[] getDeclaredMethods():仅返回自己的所有方法的Method数组
        public Object invoke(Object obj,Object...args):调用方法
                第一个参数obj表示对象,第二个参数args表示传给该方法的实际参数
               
        B:代码演示
        public class ReflectDemo{
                public static void main(String[] args) throws Exception{
                        //获取字节码文件对象
                        Class c = Class.forName("cn.itcast_01.Person");
                        //通过无参构造方法创建对象
                        Constructor con = c.getConstructor();
                        Object obj = con.newInstance();
                        //获取单个公共无参方法并使用
                        Method m1 = c.getMethod("show");
                        m1.invoke(obj);
                        //获取单个公共带参方法并使用
                        Method m2 = c.getMethod("method",String.class);
                        m2.invoke(obj,"hello");
                        //获取返回值类型为String的公共带参构造方法并使用
                        Method m3 = c.getMethod("getString",String.class,int.class);
                        Object objString = m3.invoke(obj,"hello",100);
                        System.out.println(objString);
                        //获取单个私有无参方法并使用
                        Method m4 = c.getDeclareMethod("function");
                        m4.setAccessible(true);
                        m4.invoke(obj);
                }
        }
       
设计模式部分总结

1.简单工厂模式
        public abstract class Animal {
                public abstract void eat();
        }
        public class Cat extends Animal{
                public void eat(){
                        System.out.println("猫吃鱼");
                }
        }
        public class Dog extends Animal{
                public void eat(){
                        System.out.println("狗吃肉");
                }
        }
        public class AnimalFactory{
                private AnimalFactory(){
                }
                public static Animal createAnimal(String type){
                        if("dog".equals(type)){
                                return new Dog();
                        }else if("cat".equals(type)){
                                return new Cat();
                        }else{
                                return null;
                        }
                }
        }
        public class AnimalDemo{
                public static void main(String[] args){
                        Animal a = AnimalFactory.createAnimal("dog");
                        a.eat();
                        a = AnimalFactory.createAnimal("cat");
                        a.eat();
                        a = AnimalFactory.ctrateAnimal("pig");
                        if(a != null){
                                a.eat();
                        }else{
                                System.out.println("暂时不提供这种动物!");
                        }
                       
                }
        }
2.单例模式
        A:单例模式的思想
                保证类在内存中只有一个对象
        B:如何实现类在内存中只有一个对象?
                a:把构造方法私有
                b:在成员位置自己创建一个对象
                c:通过一个公共的方法提供访问
       
        C:饿汉式(不会出问题的单例模式)
        public class Student {
                private Student(){
                }
                private static Student s = new Student();
                public static Student getStudent(){
                        return s;
                }
        }
        public calss StudentDemo{
                public static void main(String[] args){
                        Student s1 = Student.getStudent();
                        Student s2 = Student.getStudent();
                        System.out.println(s1 == s2);                //true
                }
        }
       
        D:懒汉式(可能存在线程安全问题)
        public calss Student{
                private Student(){
                }
                private static Student s = null;
                public synchronized static Student getStudent(){
                        if(t == null){
                                t = new Student();
                        }
                        return t;
                }
        }
        public class StudentDemo{
                public static void main(String[] args){
                        Student s1 = Student.getStudent();
                        Student s1 = Student.getStudent();
                        System.out.println(s1 == s2);                //true
                }
        }
       

2 个回复

倒序浏览
学习了,赞!
回复 使用道具 举报
分享的很好,赞
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马