1.测试类如下:
Person.java:
package com.fill.jdbc;
public class Person {
private int age;
private String name;
private String sex;
public String ss;
public int getAge() {
returnage;
}
public void setAge(intage) {
this.age =age;
}
public Person(intage, String name, Stringsex) {
super();
this.age =age;
this.name =name;
this.sex =sex;
System.out.println("有参方法");
}
private void sy(){
System.out.println("测试私有");
}
public Person(){
System.out.println("无参方法");
}
public String getName() {
returnname;
}
public void setName(Stringname) {
this.name =name;
}
public String getSex() {
eturnsex;
}
public void setSex(Stringsex) {
this.sex =sex;
}
}
2.利用反射来获取类的信息ReflectionDemo.php
package com.fill.jdbc;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectionDemo {
/*
*得到Class类的对象有三种方式
*a.Object类中的getClass方法
*b.类.class
*c.Class类的forName方法
*/
public staticvoid main(String[] args) {
constru_class();
}
public static void iniclass(){
// TODO Auto-generated method stub
Person p1=new Person(16,"小丽","女");
Person p=new Person(18,"小娟","女");
//一个Class对象代表一份字节码,相同类型的对象得到的字节码对象是同一个
//创建Class对象方式1
Class personClass=p1.getClass();
Class personClass2=p.getClass();
System.out.println(personClass==personClass2);
//返回的是true;因为是getClass出来是同一个对象
//b.类.class
Class personClass3=Person.class;
System.out.println(personClass==personClass3);
//也是true;
//Class类的forName方法
try {
ClasspersonClass4=Class.forName("com.fill.jdbc.Person");
} catch (ClassNotFoundExceptione) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public staticvoid constru_class(){
/*
* 使用Class类进行对象的实例化操作
* a.调用无参构造进行实例化
* b.调用有参构造进行实例化
*/
try {
ClasspersonClass4=Class.forName("com.fill.jdbc.Person");
//a.无参构造=》如果类中没有无参构造方法,会报异常
Person p3=(Person)personClass4.newInstance();
//获取所有构造方法
Constructor[]cs=personClass4.getConstructors();
//b.有参构造
/*
for(Constructor c:cs){
//打印出构造方法名称
System.out.println(c.getName());
Class[] paramTypes=c.getParameterTypes();
for(Class class1:paramTypes){
System.out.println(class1);
}
}
*/
try {
Constructorc1=personClass4.getConstructor(int.class,String.class,String.class);
Person p4=(Person)c1.newInstance(23,"玉玉","女");
/*
System.out.println(p4.getAge());
//a.根据反射获取类信息
System.out.println("包信息:"+personClass4.getPackage());
System.out.println("类名:"+personClass4.getName());
//获取所有方法(父类,超类的所有公共方法)
Method[] methods=personClass4.getMethods();
for(int i=0;i<methods.length;i++){
Method m=methods[i];
System.out.println("类名:"+m.getName()+"=="+m.getReturnType());
}
System.out.println("=========");
//获取所有(包括私有不包括继承);
Method[] me=personClass4.getDeclaredMethods();
for(int i=0;i<me.length;i++){
Method m=me[i];
System.out.println("类名:"+m.getName()+"=="+m.getReturnType());
}
System.out.println(">>>>>>>>>");
//获取属性=>公有
Field[] fie=personClass4.getFields();
for(int i=0;i<fie.length;i++){
Field m=fie[i];
System.out.println(m.getName());
}
*/
//调用属性和方法(invoke)
Method m4=personClass4.getMethod("setName", String.class);
//调用方法
//表示在p4的对象上调用这个setName方法==p4.setName("粉粉");
m4.invoke(p4,"粉粉");
System.out.println(p4.getName());
//下面开始调私有方法
Method sy=personClass4.getDeclaredMethod("sy");
sy.setAccessible(true);//忽略检查访问修饰符,设置为能访问
sy.invoke(p4);
//下面调用属性(私有和公有)
Field namefield=personClass4.getDeclaredField("name");
namefield.setAccessible(true);
System.out.println(namefield.get(p4));//获取p4的name属性
} catch (NoSuchMethodExceptione) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityExceptione) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentExceptione) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetExceptione) {
//TODO Auto-generated catch block
e.printStackTrace();
}catch (NoSuchFieldExceptione) {
//TODO Auto-generated catch block
e.printStackTrace();
}
//通过Class类获取类信息
//eg a:取得类所在包 b.取得一个类中全部方法 c.取得一个类中全部属性
} catch (ClassNotFoundExceptione) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (InstantiationExceptione) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessExceptione) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}