反射

~~ 先說說我對反射的認識: 加載完類之後,在堆內存的方法區中就產生了一個Class類型的對象(一個類只有 一個Class對象),這個對象就包含了完整的類的結構信息。我們可以通過這個對 象看到類的結構。這個對象就像一面鏡子,透過這個鏡子看到類的結構,所以, 我們形象的稱之爲:反射~~

這章節學的屬實不好,我就用老師的代碼和自己的理解完成這篇,直接上代碼

1.

public class demo {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        User yang = new User(1, 2, "yang");
        User yang1 = new User(1, 3, "yang");
        System.out.println(yang.hashCode());
        System.out.println(yang1.hashCode());

        Class class1 = yang.getClass();
        Class class2 = yang1.getClass();
        System.out.println(class1.hashCode());
        System.out.println(class2.hashCode());

        Class class3 = Class.forName("User");
        User user=(User) class3.newInstance();
        user.setAge(5);
        user.setId(5);
        user.setName("kaibo");

        System.out.println(user);
}
}
class User{
private int id;
private int age;
private String name;

public User() {
}

public User(int id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}

public int getId() {
return id;
}

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

public int getAge() {
return age;
}

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

public String getName() {
return name;
}

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

@Override
public String toString() {
return "User{" +
"id=" + id +
", age=" + age +
", name='" + name + '\'' +
'}';
}
}
460141958
1163157884
1956725890
1956725890
User{id=5, age=5, name='kaibo'}

這段代碼要說明類加載了一次,創建新對象創建幾次就是幾次

2.

public class demo2 {
public static void main(String[] args) throws ClassNotFoundException {
        Person person = new Student();
        System.out.println("這個人是:"+person);
        System.out.println("============================");
        Class class1 = person.getClass();
        Class class2 = Class.forName("Person");
        Class class3=Student.class;
        Class type=Integer.TYPE;
        Class class4 = class1.getSuperclass();

        System.out.println(class1);
        System.out.println(class2);
        System.out.println(class3);
        System.out.println(class4);
        System.out.println(type);
}
}

class Person{
public String name;

public Person() {
}

public Person(String name) {
this.name = name;
}

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

}

class Student extends Person{
public Student() {
this.name = "學生";
}
}

class Teacher extends Person{
public Teacher() {
this.name = "老師";
}
}
這個人是:Person{name='學生'}
============================
class Student
class Person
class Student
class Person
int

這段代碼獲取對象的class類

3.

public class demo4 {
    public static void main(String[] args) throws Exception{
        Class class1 = Class.forName("User");
        System.out.println("=========================");

        System.out.println(class1.getName());
        System.out.println(class1.getSimpleName());
        System.out.println("=======================");

        Field[] fields = class1.getFields();
        System.out.println(fields.length);

        Field[] fields2 = class1.getDeclaredFields();
        System.out.println(fields2.length);

        for (Field field : fields2) {
            System.out.println("field=>"+field);
        }

        Field name = class1.getDeclaredField("name");
        System.out.println(name);

        System.out.println("==============================");
        Method[] method = class1.getMethods();
        System.out.println(method.length);
        for (Method method1 : method) {
            System.out.println("declareMethods:=>"+method1);
        }

        Method setName = class1.getMethod("setName", String.class);
        Method setAge = class1.getMethod("setAge", int.class);
        System.out.println(setAge);
        System.out.println(setName);
        System.out.println("=============================");
        Constructor constructor = class1.getConstructor(null);
        Constructor constructor1 = class1.getConstructor(int.class, int.class, String.class);
        System.out.println(constructor);
        System.out.println(constructor1);
    }
}
=========================
User
User
=======================
0
3
field=>private int User.id
field=>private int User.age
field=>private java.lang.String User.name
private java.lang.String User.name
==============================
15
declareMethods:=>public java.lang.String User.toString()
declareMethods:=>public java.lang.String User.getName()
declareMethods:=>public int User.getId()
declareMethods:=>public void User.setName(java.lang.String)
declareMethods:=>public void User.setId(int)
declareMethods:=>public void User.setAge(int)
declareMethods:=>public int User.getAge()
declareMethods:=>public final void java.lang.Object.wait() throws java.lang.InterruptedException
declareMethods:=>public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
declareMethods:=>public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
declareMethods:=>public boolean java.lang.Object.equals(java.lang.Object)
declareMethods:=>public native int java.lang.Object.hashCode()
declareMethods:=>public final native java.lang.Class java.lang.Object.getClass()
declareMethods:=>public final native void java.lang.Object.notify()
declareMethods:=>public final native void java.lang.Object.notifyAll()
public void User.setAge(int)
public void User.setName(java.lang.String)
=============================
public User()
public User(int,int,java.lang.String)

這段代碼描述瞭如何獲取私有以及非私有的對象屬性

4.


public class demo6 {
    public static void main(String[] args) throws Exception, IllegalAccessException, InstantiationException {
        Class c1 = Class.forName("User");
        User user1 = (User) c1.newInstance();
        System.out.println(user1);
        System.out.println("==================");
        Constructor declaredConstructor = c1.getDeclaredConstructor(int.class, int.class, String.class);
        User user2 =(User) declaredConstructor.newInstance(1, 3, "yang");
        System.out.println(user2);
        System.out.println("========================");

        User user3 = (User) c1.newInstance();
        Method setName = c1.getDeclaredMethod("setName", String.class);

        setName.invoke(user3,"yanmgkaibo");
        System.out.println(user3.getName());


        System.out.println("=====================");
        User user4=(User)c1.newInstance();
        Field name = c1.getDeclaredField("name");
        System.out.println(user4.getName());

        name.setAccessible(true);
        name.set(user4,"楊凱波");
        System.out.println(user4.getName());
    }
}
User{id=0, age=0, name='null'}
==================
User{id=1, age=3, name='yang'}
========================
yanmgkaibo
=====================
null
楊凱波

這段按寫的是如何更改對象屬性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章