构造函数跟创建对象的同时执行,构造函数可以重载,如果在建类的同时没有创建构造函数,系统会自动创建一个没有参数的构造函数。
通过反射创建对象
package wm_io;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/*/
*在java中可以通过以下两种方式通过反射创建对象
*1.使用class类的newInstance()
* 调用某个类的Class对象的newInstance()方法,可以获得与Class对象对应类的实例
* 注意:使用Class类的newInstance()方法,要求与之对应的类必须提供无参的构造函数。
*
* 2.使用Constructor类实现
* javalang.reflect.Constructor类
* 注意:使用Constror创建对象时,应首先获得类的Class对象,然后通过Class类获得Constructor类的实例
*/
public class test2 {
private String classroom;
public String getClassroom() {
return classroom;
}
public void setClassroom(String classroom) {
this.classroom = classroom;
}
private String nameString;
public String getNameString() {
return nameString;
}
public void setNameString(String nameString) {
this.nameString = nameString;
}
public test2(){
nameString="wm";
classroom="卓越软件";
}
public test2(String classroom,String nameString){
this.classroom=classroom;
this.nameString=nameString;
}
public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException{
/*1.使用class类的newInstance()
* 调用某个类的Class对象的newInstance()方法,可以获得与Class对象对应类的实例
* 注意:使用Class类的newInstance()方法,要求与之对应的类必须提供无参的构造函数。
* //使用构造方法创建类的实例
test2 test2=new test2();
//通过test2获得类的Class对象
Class c = test2.getClass();
//通过调用Class对象调用newInstance()方法,创建对象test22
test2 test22 =(wm_io.test2) c.newInstance();
//通过反射创建对象,获得类的信息
String name=test22.getNameString();
System.out.println(name);*/
/*
* 2.使用Constructor类实现
* javalang.reflect.Constructor类
* 注意:使用Constror创建对象时,应首先获得类的Class对象,然后通过Class类获得Constructor类的实例
* 通过有参数的构造方法创建对象时,使用Constructor
* 通过无参数的构造方法创建对象时,使用class类的newInstance()
*/
//获得类的class对象
Class c=test2.class;
//通过Class对象获得构造器对象
Constructor constructor=c.getConstructor();
//创建类的实例
test2 test2=(wm_io.test2) constructor.newInstance();
System.out.println("姓名和班级分别是:"+test2.getNameString()+test2.getClassroom());
//下面使用有参的构造方法创建对象
//获得类的构造器对象
Constructor constructor2= c.getConstructor(String.class,String.class);
//创建类的实例
test2 test22=(wm_io.test2) constructor2.newInstance("wm","卓越软件1301");
System.out.println("姓名和班级分别是:"+test22.getNameString()+test22.getClassroom());
/**
* 通过反射获得类的接口
Class c2= Class.forName("wm_io.test2");
Class[] inte=c2.getInterfaces();
for(int i=0;i<inte.length;i++){
System.out.println(inte[i].getName());
}*/
/**
* 通过反射获得其他类中的父类
Class c2=Class.forName("wm_io.test2");
Class su=c2.getSuperclass();
System.out.println(su.getName());*/
/**
* 通过反射调用其它类中的方法
Class c2=Class.forName("wm_io.test2");
//调用sum方法
Method method = c2.getMethod("sum");
method.invoke(c2.newInstance());
*/
}
}
Java反射的概念
反射含义:可以获取正在运行的Java对象。
2、Java反射的功能
1)可以判断运行时对象所属的类
2)可以判断运行时对象所具有的成员变量和方法
3)通过反射甚至可以调用到private的方法
4)生成动态代理
3、实现Java反射的类
1)Class:它表示正在运行的Java应用程序中的类和接口
2)Field:提供有关类或接口的属性信息,以及对它的动态访问权限
3)Constructor:提供关于类的单个构造方法的信息以及对它的访问权限
4)Method:提供关于类或接口中某个方法信息
注意:Class类是Java反射中最重要的一个功能类,所有获取对象的信息(包括:方法/属性/构造方法/访问权限)都需要它来实现