java构造器及反射

构造器与其他方法有一个很重要的不同。构造器总是伴随着new操作符的执行才被调用。而不能对一个已经存在的对象来调用构造器达到重新设置实例域的目的。所有java对象都是在堆中构造的,构造器总是伴随着new操作符一起使用

java构造器:

  • 构造器与类同名
  • 每个类可以有一个以上的构造器
  • 构造器可以有0个、1个或多个参数
  • 构造器没有返回值
  • 构造器总是伴随着new操作仪器调用

如:

public class User {

    User() {
        System.out.println("无参数构造器");
    }

    User(String name, int age) {
       /* this.name=name;//this指示隐式参数
        this.age=age;*/
        this();   //这个必须放在第一步执行
        System.out.println("2个参数");
    }

   // private String name;
    private String name="张三";//显示初始化
    private int age;

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

java反射:

使用反射最重要的内容就是我们可以检查类的结构:

我们可以自己定义一个 ReflectionTest,运行main方法在控制台中输入我们要查看的类对象,就可以打印出这个类对象的详细信息。

public class ReflectionTest {
    public static void main(String[] args) {
        //从命令行中读取用户输入的值
        String name;
        if(args.length>0)
            name=args[0];
        else
        {
            Scanner in =new Scanner(System.in);
            System.out.println("输入的类名");
            name =in.next();
        }
        try{
            // print class name and superclass name (if !=Object)
            Class c1=Class.forName(name);
            Class superC1=c1.getSuperclass();
            String modofiers = Modifier.toString(c1.getModifiers());
           //getModifiers()  返回一个用于描述构造器,方法或者域的修饰符的整型数值。使用
            //Modifier类中的toString方法可以分析这个修饰符是 private ,protected 还是public
            if(modofiers.length()>0)
                System.out.print(modofiers+" ");
            System.out.println("class "+name);
            if(superC1!=null && superC1 != Object.class)
                System.out.print(" extends"+superC1.getName());
            System.out.print("\n{\n");
            printConstructors(c1);
            System.out.println();
            printMethods(c1);
            System.out.println();
            printFieldds(c1);
            System.out.println("}");
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
        System.exit(0);
    }
    /**
     * Prints all constracors of a class
     */
  public static void printConstructors(Class c1)
  {
      Constructor[] constructors=c1.getConstructors();
      for(Constructor c: constructors)
      {
          String name =c.getName();
          System.out.println("   ");
          String modifiers=Modifier.toString(c.getModifiers());
          if(modifiers.length()>0)
              System.out.print(modifiers+" ");
          System.out.print(name+"(");

          // print parameter types
          Class[] parameter =c.getParameterTypes();
          for(int j=0;j<parameter.length;j++)
          {
              if(j>0) System.out.print(",");
              System.out.print(parameter[j].getName());
          }
          System.out.println(");");
      }
  }
    /**
     * Prints all methods of a class
     */
    public static void printMethods(Class c1)
    {
        Method[] methods=c1.getDeclaredMethods();  //返货这个类或接口的全部方法
        for(Method m:methods)
        {
            Class retType =m.getReturnType();
            String name=m.getName();
            System.out.println("  ");
            //print modifies ,return type and method name
            String modifies =Modifier.toString(m.getModifiers());
            if(modifies.length()>0)
                System.out.print(modifies+" ");
            System.out.print(retType.getName()+" "+name+"(");

            //prints parameter types
            Class[] paramTypes =m.getParameterTypes();
            for(int j=0;j<paramTypes.length;j++)
            {
                if(j>0)System.out.print(",");
                System.out.print(paramTypes[j].getName());
            }
            System.out.println(");");
        }
    }


    /**
     *Prints all fields of a class
     */
    public static void printFieldds(Class c1)
    {
        Field[] fields=c1.getDeclaredFields (); //getFields获得所有的public字段
        for(Field f:fields)
        {
            Class type =f.getType();
            String name =f.getName();
            System.out.print("  ");
            String modifiers=Modifier.toString(f.getModifiers());
            if(modifiers.length()>0)
                System.out.print(modifiers+" ");
            System.out.println(type.getName()+" "+name+";");
        }
    }
}

我们来用User类来试一下:控制台打印结果如下:

输入的类名
constructor.User //constructor是我的User类所在的包名
public class constructor.User

{

  
public java.lang.String toString();
  
public java.lang.String getName();
  
public void setName(java.lang.String);
  
public int getAge();
  
public void setAge(int);
  
private void myprivte();

  private java.lang.String name;
  private int age;
}

Process finished with exit code 0

当然我们也可以使用这个ReflectionTest对象来查看java内置的类: 如传入java.lang.Double

打印结果如下:

输入的类名
java.lang.Double
public final class java.lang.Double
 extendsjava.lang.Number
{
   
public java.lang.Double(double);
   
public java.lang.Double(java.lang.String);

  
public boolean equals(java.lang.Object);
  
public static java.lang.String toString(double);
  
public java.lang.String toString();
  
public int hashCode();
  
public static int hashCode(double);
  
public static double min(double,double);
  
public static double max(double,double);
  
public static native long doubleToRawLongBits(double);
  
public static long doubleToLongBits(double);
  
public static native double longBitsToDouble(long);
  
public volatile int compareTo(java.lang.Object);
  
public int compareTo(java.lang.Double);
  
public byte byteValue();
  
public short shortValue();
  
public int intValue();
  
public long longValue();
  
public float floatValue();
  
public double doubleValue();
  
public static java.lang.Double valueOf(java.lang.String);
  
public static java.lang.Double valueOf(double);
  
public static java.lang.String toHexString(double);
  
public static int compare(double,double);
  
public static boolean isNaN(double);
  
public boolean isNaN();
  
public static boolean isFinite(double);
  
public static boolean isInfinite(double);
  
public boolean isInfinite();
  
public static double sum(double,double);
  
public static double parseDouble(java.lang.String);

  public static final double POSITIVE_INFINITY;
  public static final double NEGATIVE_INFINITY;
  public static final double NaN;
  public static final double MAX_VALUE;
  public static final double MIN_NORMAL;
  public static final double MIN_VALUE;
  public static final int MAX_EXPONENT;
  public static final int MIN_EXPONENT;
  public static final int SIZE;
  public static final int BYTES;
  public static final java.lang.Class TYPE;
  private final double value;
  private static final long serialVersionUID;
}

猜你喜欢

转载自blog.csdn.net/qq_35716892/article/details/84981212