~~ 先說說我對反射的認識: 加載完類之後,在堆內存的方法區中就產生了一個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
楊凱波
這段按寫的是如何更改對象屬性