获取class对象
最常用的方法
Class class = Class.forName("包.需要的类");
public class Demo01 {
public static void main(String[] args) {
//第一种获取Class的方法
// Student stu = new Student();
// Class stucls = stu.getClass();
// System.out.println(stucls.getName());
//第二种获取Class的方法
// Class cls = Student.class;
// System.out.println(cls.getName());
//第三种获取Class的方法 较为常用
try {
Class cls = Class.forName("demo.Student");
System.out.println(cls.getName());
}catch(Exception e){
System.out.println(e);
}
}
}
先创建需要的类
package demo;
public class Student {
public int age;
protected String name;
private int id;
public Student(){
System.out.println("构造方法执行了");
}
protected Student(int age){
this.age = age;
System.out.println("带age的构造方法执行了");
}
private Student(String name){
this.name = name;
System.out.println("带name的构造方法执行了");
}
Student(int age,String name,int id){
this.age = age;
this.name = name;
this.id = id;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public int getId() {
return id;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
", id=" + id +
'}';
}
}
package demo;
public class Boy {
public void show1(String s){
System.out.println("调用了:公有的,String参数的show1(): s = " + s);
}
protected void show2(){
System.out.println("调用了:受保护的,无参的show2()");
}
void show3(){
System.out.println("调用了:默认的,无参的show3()");
}
private String show4(int age){
System.out.println("调用了,私有的,并且有返回值的,int参数的show4(): age = " + age);
return "abcd";
}
public static void main(String[] args) {
System.out.println("main方法执行了。。。");
}
}
反射获取构造方法
代码基本一看就懂
/**
*
*
* 通过Class对象可以获取某个类中的:构造方法、成员变量、成员方法;并访问成员;
*
* 1.获取构造方法:
* 1).批量的方法:
* public Constructor[] getConstructors():所有"公有的"构造方法
public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)
* 2).获取单个的方法,并调用:
* public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法:
* public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;
*
* 调用构造方法:
* Constructor-->newInstance(Object... initargs)
*/
public class Demo02 {
public static void main(String[] args) throws Exception{
Class cls = Class.forName("demo.Student");
//获取构造方法,批量获取,只能获取共有
Constructor[] cons1 = cls.getConstructors();
for (Constructor c1:cons1
) {
System.out.println("名称:"+c1.getName());
System.out.println("参数长度:"+c1.getParameters().length);
}
System.out.println("===============*********============");
//获取全部的构造方法,包括私有的
Constructor[] cons2 = cls.getDeclaredConstructors();
for (Constructor c2:cons2
) {
System.out.println("名称:"+c2.getName());
System.out.println("参数长度:"+c2.getParameters().length);
}
System.out.println("*****************==========****************");
//获取无参构造
Constructor cons3 = cls.getDeclaredConstructor(null);
System.out.println(cons3.getParameters().length);
System.out.println("*****************==========****************");
//获取有参构造
Constructor cons4 = cls.getDeclaredConstructor(int.class,String.class,int.class);
System.out.println(cons4.getParameters().length);
Constructor cons5 = cls.getDeclaredConstructor(int.class);
System.out.println(cons5.getParameters().length);
System.out.println("*****************==========****************");
//使用构造 创建对象
Object obj1 = cons3.newInstance(null);
System.out.println(obj1);
System.out.println();
Object obj2 = cons4.newInstance(20,"zhangsan",29);
System.out.println(obj2);
System.out.println();
Object obj3 = cons5.newInstance(10);
System.out.println(obj3);
}
}
反射获取属性
/**
*
* 反射获取属性
* 1.批量的
* 1).Field[] getFields():获取所有的"公有字段"
* 2).Field[] getDeclaredFields():获取所有字段,包括:私有、受保护、默认、公有;
* 2.获取单个的:
* 1).public Field getField(String fieldName):获取某个"公有的"字段;
* 2).public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)
*
* 设置字段的值:
* Field --> public void set(Object obj,Object value):
* 参数说明:
* 1.obj:要设置的字段所在的对象;
* 2.value:要为字段设置的值;
*/
public class Demo03 {
public static void main(String[] args) throws Exception{
//获取class对象
Class cls = Class.forName("demo.Student");
//获取公有属性
Field[] fields = cls.getFields();
for (Field f1:fields
) {
System.out.println(f1.getName());
System.out.println(f1.getType());
}
System.out.println("****************===========******************");
//获取全部属性
Field[] fields1 = cls.getDeclaredFields();
for (Field f2:fields1
) {
System.out.println(f2.getName());
System.out.println(f2.getType());
}
System.out.println("****************===========******************");
//获取单个属性
Field field1 = cls.getDeclaredField("age");
System.out.println(field1.getType());
System.out.println();
Field field2 = cls.getDeclaredField("name");
System.out.println(field2.getType());
System.out.println();
Field field3 = cls.getDeclaredField("id");
System.out.println(field3.getType());
System.out.println("****************===========******************");
//给属性赋值
Object obj1 = cls.getDeclaredConstructor().newInstance();
field1.set(obj1,55);
field2.set(obj1,"张三");
// field3.set(obj1,1001);私有化属性无法赋值
System.out.println(obj1);
System.out.println("****************===========******************");
System.out.println();
Field[] fis = cls.getDeclaredFields();
Object obj2 = cls.getDeclaredConstructor().newInstance();
for (Field ff:fis
) {
switch (ff.getName()){
case "age":
System.out.println(ff.getType());
ff.set(obj2,89);
System.out.println(obj2);
break;
case "name":
System.out.println(ff.getType());
ff.set(obj2,"张三");
System.out.println(obj2);
break;
}
}
System.out.println(obj2);
}
}
反射获取方法
/**
*
* 反射获取方法
* 1.批量的:
* public Method[] getMethods():获取所有"公有方法";(包含了父类的方法也包含Object类)
* public Method[] getDeclaredMethods():获取所有的成员方法,包括私有的(不包括继承的)
* 2.获取单个的:
* public Method getMethod(String name,Class<?>... parameterTypes):
* 参数:
* name : 方法名;
* Class ... : 形参的Class类型对象
* public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
*
* 调用方法:
* Method --> public Object invoke(Object obj,Object... args):
* 参数说明:
* obj : 要调用方法的对象;
* args:调用方式时所传递的实参;
*/
public class Demo04 {
public static void main(String[] args) throws Exception{
//创建class对象
Class cls = Class.forName("demo.Boy");
//获取公有的方法
Method[] m1 = cls.getMethods();
for (Method m:m1
) {
System.out.println(m.getName());
}
System.out.println("***************=========//************");
System.out.println();
//获取全部的方法
Method[] m2 = cls.getDeclaredMethods();
for (Method m:m2
) {
System.out.println(m.getName());
}
System.out.println("***************=========//************");
System.out.println();
//获取单独的方法
Method m3 = cls.getDeclaredMethod("show1",String.class);
System.out.println(m3.getName());
Method m4 = cls.getDeclaredMethod("show2");
System.out.println(m4.getName());
Method m5 = cls.getDeclaredMethod("show3");
System.out.println(m5.getName());
Method m6 = cls.getDeclaredMethod("show4",int.class);
System.out.println(m6.getName());
Method m7 = cls.getDeclaredMethod("main",String[].class);
System.out.println(m7.getName());
System.out.println("***************=========//************");
System.out.println();
// 5.执行 明确执行的对象 方法的参数
Object obj = cls.getDeclaredConstructor().newInstance();
m3.invoke(obj,"琪琪小憨憨");
System.out.println(obj);
m4.invoke(obj,null);
m5.invoke(obj,null);
//m6.invoke(obj,200);私有方法无法进行赋值
m7.invoke("main",(Object)new String[]{"a","b","c"});
}
}