Home Tags Posts tagged with "构造器"

构造器

 

通过Class创建实例

创建实例的五种方式链接:http://yangbili.co/class%e7%b1%bb%e7%9a%84%e8%8e%b7%e5%8f%96%e6%96%b9%e5%bc%8f%ef%bc%88%e9%87%8d%e7%82%b9%ef%bc%89/

老规矩,上代码:

package com.yang.reflection;


import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 创建对象的方式
 * 1.new
 * 2.默认无参构造器:Class.forname(),.newInstance()
 * 3.指定构造器
 */
//动态的创建对象,通过反射
public class GetNewObject {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        //获得Class对象
        Class c1 =Class.forName("com.yang.reflection.User");

        //构造一个对象
//        User user1 = (User) c1.newInstance();//本质上调用了类的无参构造器
//        System.out.println(user);

        //通过指造器创建对象
        Constructor constructor = c1.getDeclaredConstructor(String.class, int.class, int.class);
        User user2 = (User) constructor.newInstance("咩咩咩", 001, 19);
        System.out.println(user2);

        //通过反射调用普通方法
        User user3 = (User) c1.newInstance();
        //通过反射获取一个方法
        Method setName = c1.getDeclaredMethod("setName",String.class);
        /**
         * @param user3 调用方法的对象(这里体现了反字)
         * @param "大黑狗" 给方法传参
         * */
        setName.invoke(user3,"大黑狗");
        System.out.println(user3.getName());

        //通过反射操作属性
        User user4 = (User) c1.newInstance();
        Field name = c1.getDeclaredField("name");

        //不能直接操作私有属性,需要关闭程序的安全检查,setAccessible(true)
        name.setAccessible(true);
        name.set(user4,"白羊");
        System.out.println(user4.getName());
    }
}

废话不多说,直接上代码

(代码地址:Desktop\个人学习代码\Reflection)

package com.yang.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

//获得类的信息
public class GetClassinfomation{
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {

        Class<?> c1 = Class.forName("com.yang.reflection.User");

//        User user = new User();
//        c1 = user.getClass();

        //获得类的名字
        System.out.println(c1.getName());//包名+类名
        System.out.println(c1.getSimpleName());//获得类名
        System.out.println("======================");

        //获得类的属性
        Field[] fields = c1.getFields();//只能找到public属性

        fields = c1.getDeclaredFields();//找到全部的属性
        for (Field field : fields) {
            System.out.println(field);
        }

        Field name = c1.getDeclaredField("name");//通过属性名获得属性
        System.out.println(name);

        System.out.println("======================");

        //获取类的方法
        Method[] methods = c1.getMethods();//获得本类及父类的全部public方法
        for (Method method : methods) {
            System.out.println("正常的:"+method);
        }

        Method[] declaredMethods = c1.getDeclaredMethods();//获得本类的全部方法,包括私有的方法
        for (Method declaredMethod : declaredMethods) {
            System.out.println("不正常的:"+declaredMethod);
        }

        System.out.println(c1.getMethod("getName", null));//获得指定方法
        /**
         * 为什么这里需要传入String.class?
         * JAVA的重载,如果方法名一样,但是无参数判断的话,它无法判断要得到哪个方法
         */
        System.out.println(c1.getMethod("setName", String.class));
        System.out.println("======================");

        //获得类构造器
        System.out.println("======================");
        Constructor[] constructors = c1.getConstructors();//获得public构造器
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }
        Constructor[] constructors2 = c1.getDeclaredConstructors();//获得本类的全部构造器
        for (Constructor constructor : constructors2) {
            System.out.println("#"+constructor);
        }

        Constructor declaredConstructor = c1.getDeclaredConstructor(String.class, int.class,int.class);
        System.out.println("指定构造器:"+declaredConstructor);
    }
}




总结:
一般来说,通过Class对象获得类的运行时的完整结构分三类:
  1. 获得public方法 getxxx()
  2.获得全部方法(包括private)getDeclaredxxx()
  3.按指定参数获得指定方法

用处:可通过Class对象获得构造器之后创建相应的实例

0 48

类的构造器主要是完成对类对象的初始化工作;一个类没有声明的构造方法也会有默认的不带参数的构造方法,如果我们添加了类的构造方法(无论是否有参)那么Java不会再添加默认的无参构造方法了,这时候就不能直接new一个对象而不传递参数了,所以我们在不知不觉中使用构造方法,这也是为什么我们在创建对象的时候后面要加一个括号(因为要调用无参的构造方法);