Loading

反射之类的加载和创建对象

public class ReflectTest01 {
    public static void main(String[] args) throws ClassNotFoundException {
        //第一种方式
        Class c1 = Class.forName("Employee");//c1引用保存地址指向堆中的对象,该对象代表的是Employee整个类
        
        //第二种方式
        //Java中每个类都有class属性
        Class c2 = Employee.class;
        
        //第三种方式
        //java语言中任何一个java对象都有getClass 方法
        Employee e = new 获得类的加载.Employee();
        Class c3 = e.getClass();
        
        //因为Employee这个类在jvm中只有一个,,所以c1,c2,c3 的内存地址是相同的,指向堆中唯一的一个对象
        System.out.println(c1==c2);//双等号两边如果是跟引用数据类型     ---->比较的是内存地址     
        System.out.println(c2==c3);
        
        //c4,c5,c6 都代表  date这个类
        Class c4 = Date.class; //c4代表 Date这个类
        Class c5 = Class.forName("java.lang.Date");  // 必须写类全名,类全名带有包名
        Date d = new Date(0);
        Class c6 = d.getClass();
        
    }

}
class Employee {
    //Field 字段
    private String name;
    
    //无参
    public Employee() {}
    //Constructor 构造函数
    public Employee(String name) {
        this.name = name;
    }
    
    //方法
    public void work() {
        System.out.println(name + "在工作");
    }

}

--------------------------------------------------------------------------------------------------------------------------------
新建一个实体类
//实体类
public class User {
private Integer id;//id
private String userCode;//用户编码
private String userName;//用户名称
private String userPassword;//用户密码
private int gerder;//性别
private Date birthday;//出生日期
private String phone;//电话
private String address;//地址
private Integer age;//年龄
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserCode() {
return userCode;
}
public void setUserCode(String userCode) {
this.userCode = userCode;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public int getGerder() {
return gerder;
}
public void setGerder(int gerder) {
this.gerder = gerder;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}

@Override
public String toString() {
return "User{" +
"id=" + id +
", userCode='" + userCode + '\'' +
", userName='" + userName + '\'' +
", userPassword='" + userPassword + '\'' +
", gerder=" + gerder +
", birthday=" + birthday +
", phone='" + phone + '\'' +
", address='" + address + '\'' +
", age=" + age +
'}';
}

public User(Integer id, String userCode, String userName) {
this.id = id;
this.userCode = userCode;
this.userName = userName;

}
public User() {
}
}
User user = new User();
 
//1反射创建对象第一种方法
Object o = c.newInstance();
//複製上去
User user1 = (User)o;
user1.setId(1);
user1.setUserCode("admin");
user1.setUserName("李四");
System.out.println(user1);


Constructor[] constructors = c.getConstructors();
for (Constructor constructor : constructors){
System.out.println("constructor"+constructor);
}
//2反射创建对象第二种方法 //通过构造方法 通过class对象获取构造器 然后newInstance
Constructor constructor = c.getConstructor(Integer.class,String.class,String.class);
Object o1 = constructor.newInstance(1, "刘思", "admin");
if(o1 instanceof User){
User user2 = (User) o1;
System.out.println(user2);
}
 ------------------------------------------------------------------------------------------------------------------------------------
练习反射


public class ArticleTypeBean {
private int id = -1;
private String typeName = "";
private String typeInfo = "";

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getTypeInfo() {
return typeInfo;
}

public void setTypeInfo(String typeInfo) {
this.typeInfo = typeInfo;
}

public String getTypeName() {
return typeName;
}

public void setTypeName(String typeName) {
this.typeName = typeName;
}

@Test
public void test() throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
Class c = Class.forName("com.rzk.valuebean.ArticleTypeBean");
//获得类的名字
System.out.println(c.getName());//获得包名和类名
System.out.println(c.getSimpleName());//获得类名

//获得类的属性
Field[] fields = c.getFields();//获得类的公开属性
fields = c.getDeclaredFields();//获得该类的全部属性
for (Field fs : fields){
System.out.println(fs);
}
//获得指定属性的值
System.out.println("----------华丽的分割线----------");
Field name = c.getDeclaredField("typeName");
System.out.println(name);

System.out.println("-------有是一条华丽的分割线-------");

//获得类的方法
Method[] methods = c.getMethods();//获得本类及其父类的全部public方法
for (Method m : methods){
System.out.println(m);
}
methods = c.getDeclaredMethods();//获得本类的所有方法
for (Method method : methods){
System.out.println("getDeclareMethods "+method);
}

//获得指定的方法 要赋值
Method typeName = c.getMethod("getTypeName");
Method setTypeName = c.getMethod("setTypeName",String.class);
System.out.println(typeName);
System.out.println(setTypeName);
System.out.println("-------有是一条华丽的分割线-------");
//获得指定的构造器
Constructor[] constructors = c.getConstructors();
for (Constructor constructor:constructors){
System.out.println(c);
}

constructors = c.getDeclaredConstructors();
for (Constructor constructor : constructors){
System.out.println(constructor);
}
System.out.println("-------有是一条华丽的分割线-------");
Constructor declaredConstructor = c.getDeclaredConstructor();
System.out.println("指定的构造器 = "+declaredConstructor);

}
 

 

posted @ 2020-03-06 15:49  Rzk  阅读(265)  评论(0编辑  收藏  举报