package com.day1;
public class Student {
public int age;
protected String name;
private char sex;
public Student(String str){
System.out.println("默认的构造方法 str"+str);
}
public Student(){
System.out.println("无参构造");
}
public Student(char name){
System.out.println("性别 name"+name);
}
public Student(String name,int age){
System.out.println("姓名:name"+name+"年龄:age"+age);
}
protected Student(Boolean b){
System.out.println("受保护的构造方法 b"+b);
}
private Student(int age){
System.out.println("私有构造方法:age"+age);
}
public void geAge(){
System.out.println("今年 age:"+age);
}
@Override
public String toString() {
return "Student [age=" + age + ", name=" + name + ", sex=" + sex + "]";
}
}
package com.day1;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
/**
* 反射
* @author YangTG
*
*/
public class Test8 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException,
SecurityException, InstantiationException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
/**
* //获取类路径,或者Class对象的方法
*/
Student t = new Student();
Class cl=t.getClass();
System.out.println(cl.getName());
Class cl1 =Student.class;
System.out.println(cl1.getName());
Class cl2 = Class.forName("com.day1.Student");
System.out.println(cl2.getName());
//通过反射获取构造方法并使用
System.out.println("------------------------------------------------");
/**
* 1先加载class对象
*/
Class student = Class.forName("com.day1.Student");
/**
* 2.获取所有公有构造方法
*/
Constructor[] conArray = student.getConstructors();
for(int i=0;i<conArray.length;i++){
System.out.println(conArray[i]);
}
/**
* 3.获取所有构造方法,包括私有和受保护的
*/
System.out.println("------------------------------------------------------------");
Constructor[] conArray1=student.getDeclaredConstructors();
for(int i=0;i<conArray1.length;i++){
System.out.println(conArray1[i]);
}
System.out.println("--------------------------------------------------------------");
/**
* 4.获取共有的无参构造方法
*/
Constructor conArray2=student.getConstructor(null);
System.out.println(conArray2);
System.out.println("-------------------------------------------------------------");
/**
* 调用构造方法
*/
Object obj = conArray2.newInstance();
System.out.println("-----------------------------------------");
/**
* 获取私有构造方法,并且调用
*/
Constructor con = student.getDeclaredConstructor(char.class);
con.setAccessible(true);//暴力访问,可以忽略访问修饰符
Object obj1 = con.newInstance('女');
System.out.println("-----------------------------------------");
/**
* 获取属性
*/
Field[] field = student.getFields();
System.out.println(Arrays.toString(field));
//获取所有属性
System.out.println("-----------------------------------------获取所有属性");
Field[] field1 =student.getDeclaredFields();
System.out.println(Arrays.toString(field1));
System.out.println("-----------------------------------------获取单个属性");
Field field2 = student.getDeclaredField("sex");
/**
* 反射 类方法的调用
*/
System.out.println(field2.getName());
System.out.println("-----------------------------------------获取所有方法");
Method[] method = student.getMethods();
System.out.println(Arrays.toString(method));
//获取某个方法,如果是有参数的话的,方法+参数类型(String.class)
Method m= student.getMethod("toString");
//反射调用构造方法
Object obj3 = student.getConstructor().newInstance();
//反射使用toString方法
m.invoke(obj3);
}
}
package com.day1;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
//
public class Test9 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException,
InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
Class cl = Class.forName("com.day1.Student");
Constructor con = cl.getConstructor();
//调用无参构造方法,如果是有参构造的话就加上参数类型
Object obj = con.newInstance();
//获取Student的属性
Field age =cl.getField("age");
//根据属性的类型给属性设置相应的值
age.set(obj, 25);
Field name =cl.getDeclaredField("name");
name.setAccessible(true);
name.set(obj, "强世武");
Field sex=cl.getDeclaredField("sex");
sex.setAccessible(true);
sex.set(obj, '男');
//获取toString方法,如果有参数的话后面加参数类型
Method method = cl.getMethod("toString");
//调用toString方法,有参数的话加参数
Object result = method.invoke(obj);
//打印输出
System.out.println(result);
}
}