java学习之路----反射基础
2013-11-26 23:09
645 查看
1.认识Class类
在正常的情况下,要一个完整的类才可以长生实例化对象,但是在JAVA中也可以通过一个对象来找到一个类的完整信息。
2.下面来举一个例子
package test;
[align=left]
[/align]
[align=left]class X{[/align]
[align=left] [/align]
[align=left]}[/align]
[align=left]
[/align]
public class GetClassDemo
{
public static void main(String[]
args) {
[align=left] X x= new X();[/align]
[align=left] [/align]
[align=left] System. out.println(x.getClass().getName());[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]结果:[/align]
[align=left]test.X[/align]
[align=left]
[/align]
[align=left]3.所有的实例对象其实都是Class类的实例[/align]
[align=left]
[/align]
[align=left]我们来看看getClass()方法的定义都知道了[/align]
public final native Class<?>
getClass();
[align=left]
[/align]
[align=left]这里返回的是一个Class类,所以所有类的实例化对象都是Class类的实例[/align]
[align=left]
[/align]
[align=left]4.Class 类的常用方法[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]4.实例化Class对象[/align]
[align=left]
[/align]
[align=left] package test;[/align]
[align=left]
[/align]
[align=left]class W{[/align]
[align=left] [/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]public class ClassDemo1 {[/align]
public static void main(String[]
args) throws Exception{
[align=left] W w= new W();[/align]
[align=left] Class<?> c1= null;[/align]
[align=left] Class<?> c2= null;[/align]
[align=left] Class<?> c3= null;[/align]
[align=left] [/align]
[align=left] c1=Class. forName(w.getClass().getName());//通过forName实例化(包.类)[/align]
[align=left] [/align]
[align=left] c2= new W().getClass();//通过Object的方法实例化[/align]
[align=left] [/align]
[align=left] c3=W. class;//通过类.class来实例化[/align]
[align=left] [/align]
[align=left] System. out.println(c1.getName());[/align]
[align=left] System. out.println(c2.getName());[/align]
[align=left] System. out.println(c3.getName());[/align]
[align=left] [/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]结果:[/align]
[align=left]test.W[/align]
[align=left]test.W[/align]
[align=left]test.W[/align]
[align=left]
[/align]
[align=left]一般用包.类来实例化是比较常用的[/align]
[align=left]
[/align]
[align=left]5. 通过无参构造来实例化对象[/align]
[align=left]class Per{[/align]
[align=left] private String name;[/align]
[align=left] [/align]
[align=left] private int age ;[/align]
public String
getName() {
[align=left] return name ;[/align]
[align=left] }[/align]
[align=left]
[/align]
public void setName(String
name) {
this .name =
name;
[align=left] }[/align]
[align=left]
[/align]
[align=left]
[/align]
public int getAge()
{
[align=left] return age ;[/align]
[align=left] }[/align]
[align=left]
[/align]
public void setAge(int age)
{
this .age =
age;
[align=left] }[/align]
[align=left]
[/align]
[align=left]
[/align]
public Per()
{
[align=left] }[/align]
[align=left]
[/align]
public Per(String
name, int age) {
this .name =
name;
this .age =
age;
[align=left] }[/align]
[align=left]
[/align]
[align=left] @Override[/align]
public String
toString() {
[align=left] [/align]
[align=left] return "名字" + this. name+ "年龄"+ this .age ;[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]
[/align]
public class ClassDemo2
{
public static void main(String[]
args) {
[align=left] Class<?> c= null ;[/align]
[align=left] [/align]
[align=left] try {[/align]
[align=left] c=Class. forName( "test.Per");[/align]
} catch (ClassNotFoundException
e) {
// TODO Auto-generated
catch block
[align=left] e.printStackTrace();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] Per per= null ;[/align]
[align=left] [/align]
[align=left] try {[/align]
[align=left] per=(Per)c.newInstance(); //实例化对象[/align]
} catch (InstantiationException
e) {
// TODO Auto-generated
catch block
[align=left] e.printStackTrace();[/align]
} catch (IllegalAccessException
e) {
// TODO Auto-generated
catch block
[align=left] e.printStackTrace();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] per.setAge(30);[/align]
[align=left] per.setName( "like" );[/align]
[align=left] [/align]
[align=left] System. out.println(per);[/align]
[align=left] [/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]结果:[/align]
[align=left]名字like年龄30 [/align]
[align=left]
[/align]
[align=left]如果是这种方式来实例化对象,你的类中没有无参构造就会报错[/align]
[align=left]
[/align]
java.lang.InstantiationException : test.Per
所以用这种方法的时候,一定要有无参的构造方法
所以在开发类的时候,最好留一个无参构造
6.有参构造来实例化对象
一般步骤如下:
首先通过Class 类中的getConstructors这个方法来获取本类中的全部方法
再:向构造方法中传递一个对象数组进去,里面包含了构造方法所需要的参数
最后:通过Constructor实例化对象
[align=left]class Per{[/align]
[align=left] private String name;[/align]
[align=left] [/align]
[align=left] private int age ;[/align]
public String
getName() {
[align=left] return name ;[/align]
[align=left] }[/align]
[align=left]
[/align]
public void setName(String
name) {
this .name =
name;
[align=left] }[/align]
[align=left]
[/align]
[align=left]
[/align]
public int getAge()
{
[align=left] return age ;[/align]
[align=left] }[/align]
[align=left]
[/align]
public void setAge(int age)
{
this .age =
age;
[align=left] }[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
public Per(String
name, int age) {
this .name =
name;
this .age =
age;
[align=left] }[/align]
[align=left]
[/align]
[align=left] @Override[/align]
public String
toString() {
[align=left] [/align]
[align=left] return "名字" + this. name+ "年龄"+ this .age ;[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]
[/align]
public class ClassDemo3
{
public static void main(String[]
args) {
[align=left] Class<?> c= null ;[/align]
[align=left] [/align]
[align=left] try {[/align]
[align=left] c=Class. forName( "test.Per");[/align]
} catch (ClassNotFoundException
e) {
// TODO Auto-generated
catch block
[align=left] e.printStackTrace();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] Per per= null ;[/align]
[align=left] [/align]
[align=left] Constructor<?> cons []= null ;[/align]
[align=left] cons=c.getConstructors();[/align]
[align=left] [/align]
[align=left] try {[/align]
[align=left] per=(Per)cons[0].newInstance( "like" ,30);[/align]
} catch (InstantiationException
e) {
// TODO Auto-generated
catch block
[align=left] e.printStackTrace();[/align]
} catch (IllegalAccessException
e) {
// TODO Auto-generated
catch block
[align=left] e.printStackTrace();[/align]
} catch (IllegalArgumentException
e) {
// TODO Auto-generated
catch block
[align=left] e.printStackTrace();[/align]
} catch (InvocationTargetException
e) {
// TODO Auto-generated
catch block
[align=left] e.printStackTrace();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] System. out.println(per);[/align]
[align=left] [/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]结果:[/align]
[align=left]名字like年龄30[/align]
[align=left]以上代码比较复杂,所以最好留一个无参构造[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]7.反射的应用。获取类的结构[/align]
[align=left]
[/align]
[align=left] 7.1 取得一个类的全部接口[/align]
[align=left]
[/align]
[align=left]package fstest;[/align]
[align=left]
[/align]
[align=left]interface China{[/align]
public static final
String NATIONAL= "china" ;
public static final
String AUTHOR= "like" ;
[align=left] public void sayChina();[/align]
public String
sayhello(String name, int age);
[align=left] [/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]public class Person implements China{[/align]
[align=left]
[/align]
[align=left] private String name;[/align]
[align=left] private int age ;[/align]
[align=left] [/align]
[align=left] [/align]
public String
getName() {
[align=left] return name ;[/align]
[align=left] }[/align]
[align=left]
[/align]
public void setName(String
name) {
this .name =
name;
[align=left] }[/align]
[align=left]
[/align]
public int getAge()
{
[align=left] return age ;[/align]
[align=left] }[/align]
[align=left]
[/align]
public void setAge(int age)
{
this .age =
age;
[align=left] }[/align]
[align=left]
[/align]
public Person()
{ //无参构造,好反射
[align=left] }[/align]
[align=left]
[/align]
public void sayChina()
{
[align=left] [/align]
[align=left] System. out .println("作者" + AUTHOR+ "国籍"+ NATIONAL );[/align]
[align=left] }[/align]
[align=left]
[/align]
public String
sayhello(String name, int age) {
[align=left] [/align]
[align=left] return name+",你好,我今年" +age+"岁了" ;[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]package test;[/align]
[align=left]
[/align]
[align=left]public class GetInterfaceDemo {[/align]
public static void main(String[]
args) throws Exception{
[align=left] Class<?>c= null ;[/align]
[align=left] [/align]
[align=left] c=Class. forName( "fstest.Person");[/align]
[align=left] [/align]
[align=left] Class<?> []c1=c.getInterfaces(); //获得所有的接口[/align]
[align=left] [/align]
[align=left] for (int i=0;i<c1. length;i++){[/align]
[align=left] System. out .println("实现接口的名字" +c1[i].getName());[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]结果:[/align]
[align=left]实现接口的名字fstest.China[/align]
[align=left]
[/align]
[align=left]接口也是一种特殊的类[/align]
[align=left]7.2取得类的父类[/align]
[align=left]
[/align]
[align=left]package test;[/align]
[align=left]
[/align]
public class GetInterfaceDemo
{
public static void main(String[]
args) throws Exception{
[align=left] Class<?>c= null ;[/align]
[align=left] [/align]
[align=left] c=Class. forName( "fstest.Person");[/align]
[align=left] [/align]
[align=left] Class<?> c1=c.getSuperclass();[/align]
[align=left] System. out .println("父类是" +c1);[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]结果:[/align]
[align=left]父类是class java.lang.Object[/align]
[align=left]
[/align]
[align=left]这就验证了一个类如果不写出继承什么类,那么它默认继承Object类[/align]
[align=left]
[/align]
[align=left]7.3取得全部的构造方法[/align]
[align=left]
[/align]
[align=left] package test;[/align]
[align=left]
[/align]
[align=left]import java.lang.reflect.Constructor;[/align]
[align=left]
[/align]
public class GetInterfaceDemo
{
public static void main(String[]
args) throws Exception{
[align=left] Class<?>c= null ;[/align]
[align=left] [/align]
[align=left] c=Class. forName( "fstest.Person");[/align]
[align=left] [/align]
[align=left] Constructor<?> c1[]=c.getConstructors();[/align]
[align=left] for (int i=0;i<c1. length;i++){[/align]
[align=left] System. out .println("构造方法" +c1[i]);[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]我在上面的那个person类中加了全参的构造方法[/align]
[align=left]package fstest;[/align]
[align=left]
[/align]
[align=left]interface China{[/align]
public static final
String NATIONAL= "china" ;
public static final
String AUTHOR= "like" ;
[align=left] public void sayChina();[/align]
public String
sayhello(String name, int age);
[align=left] [/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]public class Person implements China{[/align]
[align=left]
[/align]
[align=left] private String name;[/align]
[align=left] private int age ;[/align]
[align=left] [/align]
[align=left] [/align]
public String
getName() {
[align=left] return name ;[/align]
[align=left] }[/align]
[align=left]
[/align]
public void setName(String
name) {
this .name =
name;
[align=left] }[/align]
[align=left]
[/align]
public int getAge()
{
[align=left] return age ;[/align]
[align=left] }[/align]
[align=left]
[/align]
public void setAge(int age)
{
this .age =
age;
[align=left] }[/align]
[align=left]
[/align]
public Person()
{ //无参构造,好反射
[align=left] }[/align]
[align=left] [/align]
public Person(String
name, int age) {
this .name =
name;
this .age =
age;
[align=left] }[/align]
[align=left]
[/align]
public void sayChina()
{
[align=left] [/align]
[align=left] System. out .println("作者" + AUTHOR+ "国籍"+ NATIONAL );[/align]
[align=left] }[/align]
[align=left]
[/align]
public String
sayhello(String name, int age) {
[align=left] [/align]
[align=left] return name+",你好,我今年" +age+"岁了" ;[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]结果:[/align]
[align=left]构造方法public fstest.Person(java.lang.String,int)[/align]
[align=left]构造方法public fstest.Person()[/align]
[align=left]
[/align]
[align=left]7.4取得全部的方法[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]取得一个类的全部方法定义[/align]
[align=left] package test;[/align]
[align=left]
[/align]
[align=left]import java.lang.reflect.Method;[/align]
[align=left]import java.lang.reflect.Modifier;[/align]
[align=left]
[/align]
public class GetInterfaceDemo
{
public static void main(String[]
args) throws Exception{
[align=left] Class<?>c= null ;[/align]
[align=left] [/align]
[align=left] c=Class. forName( "fstest.Person");[/align]
[align=left] [/align]
[align=left] Method m[]=c.getMethods(); //取得全部方法[/align]
[align=left] [/align]
[align=left] for (int i=0;i<m. length;i++){[/align]
[align=left] Class<?> r=m[i].getReturnType(); //返回值类型[/align]
[align=left] [/align]
[align=left] Class<?>p[]=m[i].getParameterTypes(); //参数类型(多参数,所以多个类型,所以用数组)[/align]
[align=left] [/align]
[align=left] String name=m[i].getName(); //方法名称[/align]
[align=left] [/align]
[align=left] int xx=m[i].getModifiers();//方法修饰符[/align]
[align=left] [/align]
System. out .print(Modifier.toString(xx)+ "
"); //还原修饰符
System. out .print(r.getName()+"
" );//返回值类型
System. out .print(name+"
" );
[align=left] System. out .print("(" );[/align]
[align=left] for (int j=0;j<p. length;j++){[/align]
System. out .print(p[j].getName()+"
"+ "args"+j);
[align=left] if (j<p.length -1){[/align]
[align=left] System. out .print("," );[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] }[/align]
[align=left] Class<?>ex[]=m[i].getExceptionTypes(); //得到全部的异常[/align]
[align=left] if (ex.length >0){[/align]
System. out .print(")
throws" );
[align=left] } else {[/align]
[align=left] System. out .print(")" );[/align]
[align=left] }[/align]
[align=left] for (int x=0;x<ex. length;x++){[/align]
[align=left] System. out .print(ex[x].getName());[/align]
[align=left] if (x<ex.length -1){[/align]
[align=left] System. out .print("," );[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] System. out .println();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]结果:[/align]
[align=left]public java.lang.String sayhello (java.lang.String args0,int args1)[/align]
[align=left]public void sayChina ()[/align]
[align=left]public void setAge (int args0)[/align]
[align=left]public int getAge ()[/align]
[align=left]public java.lang.String getName ()[/align]
[align=left]public void setName (java.lang.String args0)[/align]
[align=left]public final native java.lang.Class getClass ()[/align]
[align=left]public native int hashCode ()[/align]
[align=left]public boolean equals (java.lang.Object args0)[/align]
[align=left]public java.lang.String toString ()[/align]
[align=left]public final native void notify ()[/align]
[align=left]public final native void notifyAll ()[/align]
[align=left]public final void wait (long args0,int args1) throwsjava.lang.InterruptedException[/align]
[align=left]public final void wait () throwsjava.lang.InterruptedException[/align]
[align=left]public final native void wait (long args0) throwsjava.lang.InterruptedException[/align]
[align=left]
[/align]
[align=left]是不是发现多了些方法,不是只有两个嘛,怎么这么多,这是因为默认继承Object类[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]比如在eclipse中,你输入一个"."就可以调用全部的方法,就是通过这种方法来的[/align]
[align=left]
[/align]
[align=left]7.5取得全部的属性[/align]
[align=left]
[/align]
[align=left] 这里属性又分为两个[/align]
[align=left] 一个是父类属性或者接口属性:public Field[] getFields() throws ...[/align]
[align=left] 另一个是本类的的属性 :public getDeclaredFields() throws...[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]取得person类的全部属性[/align]
[align=left]
[/align]
public class GetInterfaceDemo
{
public static void main(String[]
args) throws Exception{
[align=left] Class<?>c= null ;[/align]
[align=left] [/align]
[align=left] c=Class. forName( "fstest.Person");[/align]
[align=left] [/align]
[align=left] Field fields[]=c.getDeclaredFields();[/align]
[align=left] [/align]
[align=left] for (int i=0;i<fields. length;i++){[/align]
[align=left] Class<?> r=fields[i].getType(); //取得属性的类型[/align]
[align=left] [/align]
[align=left] int mo=fields[i].getModifiers();//取得修饰符的数字[/align]
[align=left] [/align]
[align=left] String piv=Modifier. toString(mo); //取得修饰符[/align]
[align=left] [/align]
[align=left] System. out .print("本类属性:" );[/align]
System. out .print(piv+"
" +r.getName()+ " "+fields[i].getName());
[align=left] System. out .println();[/align]
[align=left] }[/align]
[align=left] System. out .println("------------------" );[/align]
[align=left] {[/align]
[align=left] Field e[]=c.getFields();[/align]
[align=left] for (int i=0;i<e. length;i++){[/align]
[align=left] Class<?> r1=e[i].getType();[/align]
[align=left] int mo=e[i].getModifiers();[/align]
[align=left] String piv=Modifier. toString(mo);[/align]
System. out .print("父类属性" +piv+"
" + r1.getName()+" " +e[i].getName());
[align=left] System. out .println();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]结果:[/align]
[align=left]本类属性:private java.lang.String name[/align]
[align=left]本类属性:private int age[/align]
[align=left]------------------[/align]
[align=left]父类属性public static final java.lang.String NATIONAL[/align]
[align=left]父类属性public static final java.lang.String AUTHOR[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
在正常的情况下,要一个完整的类才可以长生实例化对象,但是在JAVA中也可以通过一个对象来找到一个类的完整信息。
2.下面来举一个例子
package test;
[align=left]
[/align]
[align=left]class X{[/align]
[align=left] [/align]
[align=left]}[/align]
[align=left]
[/align]
public class GetClassDemo
{
public static void main(String[]
args) {
[align=left] X x= new X();[/align]
[align=left] [/align]
[align=left] System. out.println(x.getClass().getName());[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]结果:[/align]
[align=left]test.X[/align]
[align=left]
[/align]
[align=left]3.所有的实例对象其实都是Class类的实例[/align]
[align=left]
[/align]
[align=left]我们来看看getClass()方法的定义都知道了[/align]
public final native Class<?>
getClass();
[align=left]
[/align]
[align=left]这里返回的是一个Class类,所以所有类的实例化对象都是Class类的实例[/align]
[align=left]
[/align]
[align=left]4.Class 类的常用方法[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]4.实例化Class对象[/align]
[align=left]
[/align]
[align=left] package test;[/align]
[align=left]
[/align]
[align=left]class W{[/align]
[align=left] [/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]public class ClassDemo1 {[/align]
public static void main(String[]
args) throws Exception{
[align=left] W w= new W();[/align]
[align=left] Class<?> c1= null;[/align]
[align=left] Class<?> c2= null;[/align]
[align=left] Class<?> c3= null;[/align]
[align=left] [/align]
[align=left] c1=Class. forName(w.getClass().getName());//通过forName实例化(包.类)[/align]
[align=left] [/align]
[align=left] c2= new W().getClass();//通过Object的方法实例化[/align]
[align=left] [/align]
[align=left] c3=W. class;//通过类.class来实例化[/align]
[align=left] [/align]
[align=left] System. out.println(c1.getName());[/align]
[align=left] System. out.println(c2.getName());[/align]
[align=left] System. out.println(c3.getName());[/align]
[align=left] [/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]结果:[/align]
[align=left]test.W[/align]
[align=left]test.W[/align]
[align=left]test.W[/align]
[align=left]
[/align]
[align=left]一般用包.类来实例化是比较常用的[/align]
[align=left]
[/align]
[align=left]5. 通过无参构造来实例化对象[/align]
[align=left]class Per{[/align]
[align=left] private String name;[/align]
[align=left] [/align]
[align=left] private int age ;[/align]
public String
getName() {
[align=left] return name ;[/align]
[align=left] }[/align]
[align=left]
[/align]
public void setName(String
name) {
this .name =
name;
[align=left] }[/align]
[align=left]
[/align]
[align=left]
[/align]
public int getAge()
{
[align=left] return age ;[/align]
[align=left] }[/align]
[align=left]
[/align]
public void setAge(int age)
{
this .age =
age;
[align=left] }[/align]
[align=left]
[/align]
[align=left]
[/align]
public Per()
{
[align=left] }[/align]
[align=left]
[/align]
public Per(String
name, int age) {
this .name =
name;
this .age =
age;
[align=left] }[/align]
[align=left]
[/align]
[align=left] @Override[/align]
public String
toString() {
[align=left] [/align]
[align=left] return "名字" + this. name+ "年龄"+ this .age ;[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]
[/align]
public class ClassDemo2
{
public static void main(String[]
args) {
[align=left] Class<?> c= null ;[/align]
[align=left] [/align]
[align=left] try {[/align]
[align=left] c=Class. forName( "test.Per");[/align]
} catch (ClassNotFoundException
e) {
// TODO Auto-generated
catch block
[align=left] e.printStackTrace();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] Per per= null ;[/align]
[align=left] [/align]
[align=left] try {[/align]
[align=left] per=(Per)c.newInstance(); //实例化对象[/align]
} catch (InstantiationException
e) {
// TODO Auto-generated
catch block
[align=left] e.printStackTrace();[/align]
} catch (IllegalAccessException
e) {
// TODO Auto-generated
catch block
[align=left] e.printStackTrace();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] per.setAge(30);[/align]
[align=left] per.setName( "like" );[/align]
[align=left] [/align]
[align=left] System. out.println(per);[/align]
[align=left] [/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]结果:[/align]
[align=left]名字like年龄30 [/align]
[align=left]
[/align]
[align=left]如果是这种方式来实例化对象,你的类中没有无参构造就会报错[/align]
[align=left]
[/align]
java.lang.InstantiationException : test.Per
所以用这种方法的时候,一定要有无参的构造方法
所以在开发类的时候,最好留一个无参构造
6.有参构造来实例化对象
一般步骤如下:
首先通过Class 类中的getConstructors这个方法来获取本类中的全部方法
再:向构造方法中传递一个对象数组进去,里面包含了构造方法所需要的参数
最后:通过Constructor实例化对象
[align=left]class Per{[/align]
[align=left] private String name;[/align]
[align=left] [/align]
[align=left] private int age ;[/align]
public String
getName() {
[align=left] return name ;[/align]
[align=left] }[/align]
[align=left]
[/align]
public void setName(String
name) {
this .name =
name;
[align=left] }[/align]
[align=left]
[/align]
[align=left]
[/align]
public int getAge()
{
[align=left] return age ;[/align]
[align=left] }[/align]
[align=left]
[/align]
public void setAge(int age)
{
this .age =
age;
[align=left] }[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
public Per(String
name, int age) {
this .name =
name;
this .age =
age;
[align=left] }[/align]
[align=left]
[/align]
[align=left] @Override[/align]
public String
toString() {
[align=left] [/align]
[align=left] return "名字" + this. name+ "年龄"+ this .age ;[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]
[/align]
public class ClassDemo3
{
public static void main(String[]
args) {
[align=left] Class<?> c= null ;[/align]
[align=left] [/align]
[align=left] try {[/align]
[align=left] c=Class. forName( "test.Per");[/align]
} catch (ClassNotFoundException
e) {
// TODO Auto-generated
catch block
[align=left] e.printStackTrace();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] Per per= null ;[/align]
[align=left] [/align]
[align=left] Constructor<?> cons []= null ;[/align]
[align=left] cons=c.getConstructors();[/align]
[align=left] [/align]
[align=left] try {[/align]
[align=left] per=(Per)cons[0].newInstance( "like" ,30);[/align]
} catch (InstantiationException
e) {
// TODO Auto-generated
catch block
[align=left] e.printStackTrace();[/align]
} catch (IllegalAccessException
e) {
// TODO Auto-generated
catch block
[align=left] e.printStackTrace();[/align]
} catch (IllegalArgumentException
e) {
// TODO Auto-generated
catch block
[align=left] e.printStackTrace();[/align]
} catch (InvocationTargetException
e) {
// TODO Auto-generated
catch block
[align=left] e.printStackTrace();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] System. out.println(per);[/align]
[align=left] [/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]结果:[/align]
[align=left]名字like年龄30[/align]
[align=left]以上代码比较复杂,所以最好留一个无参构造[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]7.反射的应用。获取类的结构[/align]
[align=left]
[/align]
[align=left] 7.1 取得一个类的全部接口[/align]
[align=left]
[/align]
[align=left]package fstest;[/align]
[align=left]
[/align]
[align=left]interface China{[/align]
public static final
String NATIONAL= "china" ;
public static final
String AUTHOR= "like" ;
[align=left] public void sayChina();[/align]
public String
sayhello(String name, int age);
[align=left] [/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]public class Person implements China{[/align]
[align=left]
[/align]
[align=left] private String name;[/align]
[align=left] private int age ;[/align]
[align=left] [/align]
[align=left] [/align]
public String
getName() {
[align=left] return name ;[/align]
[align=left] }[/align]
[align=left]
[/align]
public void setName(String
name) {
this .name =
name;
[align=left] }[/align]
[align=left]
[/align]
public int getAge()
{
[align=left] return age ;[/align]
[align=left] }[/align]
[align=left]
[/align]
public void setAge(int age)
{
this .age =
age;
[align=left] }[/align]
[align=left]
[/align]
public Person()
{ //无参构造,好反射
[align=left] }[/align]
[align=left]
[/align]
public void sayChina()
{
[align=left] [/align]
[align=left] System. out .println("作者" + AUTHOR+ "国籍"+ NATIONAL );[/align]
[align=left] }[/align]
[align=left]
[/align]
public String
sayhello(String name, int age) {
[align=left] [/align]
[align=left] return name+",你好,我今年" +age+"岁了" ;[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]package test;[/align]
[align=left]
[/align]
[align=left]public class GetInterfaceDemo {[/align]
public static void main(String[]
args) throws Exception{
[align=left] Class<?>c= null ;[/align]
[align=left] [/align]
[align=left] c=Class. forName( "fstest.Person");[/align]
[align=left] [/align]
[align=left] Class<?> []c1=c.getInterfaces(); //获得所有的接口[/align]
[align=left] [/align]
[align=left] for (int i=0;i<c1. length;i++){[/align]
[align=left] System. out .println("实现接口的名字" +c1[i].getName());[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]结果:[/align]
[align=left]实现接口的名字fstest.China[/align]
[align=left]
[/align]
[align=left]接口也是一种特殊的类[/align]
[align=left]7.2取得类的父类[/align]
[align=left]
[/align]
[align=left]package test;[/align]
[align=left]
[/align]
public class GetInterfaceDemo
{
public static void main(String[]
args) throws Exception{
[align=left] Class<?>c= null ;[/align]
[align=left] [/align]
[align=left] c=Class. forName( "fstest.Person");[/align]
[align=left] [/align]
[align=left] Class<?> c1=c.getSuperclass();[/align]
[align=left] System. out .println("父类是" +c1);[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]结果:[/align]
[align=left]父类是class java.lang.Object[/align]
[align=left]
[/align]
[align=left]这就验证了一个类如果不写出继承什么类,那么它默认继承Object类[/align]
[align=left]
[/align]
[align=left]7.3取得全部的构造方法[/align]
[align=left]
[/align]
[align=left] package test;[/align]
[align=left]
[/align]
[align=left]import java.lang.reflect.Constructor;[/align]
[align=left]
[/align]
public class GetInterfaceDemo
{
public static void main(String[]
args) throws Exception{
[align=left] Class<?>c= null ;[/align]
[align=left] [/align]
[align=left] c=Class. forName( "fstest.Person");[/align]
[align=left] [/align]
[align=left] Constructor<?> c1[]=c.getConstructors();[/align]
[align=left] for (int i=0;i<c1. length;i++){[/align]
[align=left] System. out .println("构造方法" +c1[i]);[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]我在上面的那个person类中加了全参的构造方法[/align]
[align=left]package fstest;[/align]
[align=left]
[/align]
[align=left]interface China{[/align]
public static final
String NATIONAL= "china" ;
public static final
String AUTHOR= "like" ;
[align=left] public void sayChina();[/align]
public String
sayhello(String name, int age);
[align=left] [/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]public class Person implements China{[/align]
[align=left]
[/align]
[align=left] private String name;[/align]
[align=left] private int age ;[/align]
[align=left] [/align]
[align=left] [/align]
public String
getName() {
[align=left] return name ;[/align]
[align=left] }[/align]
[align=left]
[/align]
public void setName(String
name) {
this .name =
name;
[align=left] }[/align]
[align=left]
[/align]
public int getAge()
{
[align=left] return age ;[/align]
[align=left] }[/align]
[align=left]
[/align]
public void setAge(int age)
{
this .age =
age;
[align=left] }[/align]
[align=left]
[/align]
public Person()
{ //无参构造,好反射
[align=left] }[/align]
[align=left] [/align]
public Person(String
name, int age) {
this .name =
name;
this .age =
age;
[align=left] }[/align]
[align=left]
[/align]
public void sayChina()
{
[align=left] [/align]
[align=left] System. out .println("作者" + AUTHOR+ "国籍"+ NATIONAL );[/align]
[align=left] }[/align]
[align=left]
[/align]
public String
sayhello(String name, int age) {
[align=left] [/align]
[align=left] return name+",你好,我今年" +age+"岁了" ;[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]结果:[/align]
[align=left]构造方法public fstest.Person(java.lang.String,int)[/align]
[align=left]构造方法public fstest.Person()[/align]
[align=left]
[/align]
[align=left]7.4取得全部的方法[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]取得一个类的全部方法定义[/align]
[align=left] package test;[/align]
[align=left]
[/align]
[align=left]import java.lang.reflect.Method;[/align]
[align=left]import java.lang.reflect.Modifier;[/align]
[align=left]
[/align]
public class GetInterfaceDemo
{
public static void main(String[]
args) throws Exception{
[align=left] Class<?>c= null ;[/align]
[align=left] [/align]
[align=left] c=Class. forName( "fstest.Person");[/align]
[align=left] [/align]
[align=left] Method m[]=c.getMethods(); //取得全部方法[/align]
[align=left] [/align]
[align=left] for (int i=0;i<m. length;i++){[/align]
[align=left] Class<?> r=m[i].getReturnType(); //返回值类型[/align]
[align=left] [/align]
[align=left] Class<?>p[]=m[i].getParameterTypes(); //参数类型(多参数,所以多个类型,所以用数组)[/align]
[align=left] [/align]
[align=left] String name=m[i].getName(); //方法名称[/align]
[align=left] [/align]
[align=left] int xx=m[i].getModifiers();//方法修饰符[/align]
[align=left] [/align]
System. out .print(Modifier.toString(xx)+ "
"); //还原修饰符
System. out .print(r.getName()+"
" );//返回值类型
System. out .print(name+"
" );
[align=left] System. out .print("(" );[/align]
[align=left] for (int j=0;j<p. length;j++){[/align]
System. out .print(p[j].getName()+"
"+ "args"+j);
[align=left] if (j<p.length -1){[/align]
[align=left] System. out .print("," );[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] }[/align]
[align=left] Class<?>ex[]=m[i].getExceptionTypes(); //得到全部的异常[/align]
[align=left] if (ex.length >0){[/align]
System. out .print(")
throws" );
[align=left] } else {[/align]
[align=left] System. out .print(")" );[/align]
[align=left] }[/align]
[align=left] for (int x=0;x<ex. length;x++){[/align]
[align=left] System. out .print(ex[x].getName());[/align]
[align=left] if (x<ex.length -1){[/align]
[align=left] System. out .print("," );[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] System. out .println();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]结果:[/align]
[align=left]public java.lang.String sayhello (java.lang.String args0,int args1)[/align]
[align=left]public void sayChina ()[/align]
[align=left]public void setAge (int args0)[/align]
[align=left]public int getAge ()[/align]
[align=left]public java.lang.String getName ()[/align]
[align=left]public void setName (java.lang.String args0)[/align]
[align=left]public final native java.lang.Class getClass ()[/align]
[align=left]public native int hashCode ()[/align]
[align=left]public boolean equals (java.lang.Object args0)[/align]
[align=left]public java.lang.String toString ()[/align]
[align=left]public final native void notify ()[/align]
[align=left]public final native void notifyAll ()[/align]
[align=left]public final void wait (long args0,int args1) throwsjava.lang.InterruptedException[/align]
[align=left]public final void wait () throwsjava.lang.InterruptedException[/align]
[align=left]public final native void wait (long args0) throwsjava.lang.InterruptedException[/align]
[align=left]
[/align]
[align=left]是不是发现多了些方法,不是只有两个嘛,怎么这么多,这是因为默认继承Object类[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]比如在eclipse中,你输入一个"."就可以调用全部的方法,就是通过这种方法来的[/align]
[align=left]
[/align]
[align=left]7.5取得全部的属性[/align]
[align=left]
[/align]
[align=left] 这里属性又分为两个[/align]
[align=left] 一个是父类属性或者接口属性:public Field[] getFields() throws ...[/align]
[align=left] 另一个是本类的的属性 :public getDeclaredFields() throws...[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]取得person类的全部属性[/align]
[align=left]
[/align]
public class GetInterfaceDemo
{
public static void main(String[]
args) throws Exception{
[align=left] Class<?>c= null ;[/align]
[align=left] [/align]
[align=left] c=Class. forName( "fstest.Person");[/align]
[align=left] [/align]
[align=left] Field fields[]=c.getDeclaredFields();[/align]
[align=left] [/align]
[align=left] for (int i=0;i<fields. length;i++){[/align]
[align=left] Class<?> r=fields[i].getType(); //取得属性的类型[/align]
[align=left] [/align]
[align=left] int mo=fields[i].getModifiers();//取得修饰符的数字[/align]
[align=left] [/align]
[align=left] String piv=Modifier. toString(mo); //取得修饰符[/align]
[align=left] [/align]
[align=left] System. out .print("本类属性:" );[/align]
System. out .print(piv+"
" +r.getName()+ " "+fields[i].getName());
[align=left] System. out .println();[/align]
[align=left] }[/align]
[align=left] System. out .println("------------------" );[/align]
[align=left] {[/align]
[align=left] Field e[]=c.getFields();[/align]
[align=left] for (int i=0;i<e. length;i++){[/align]
[align=left] Class<?> r1=e[i].getType();[/align]
[align=left] int mo=e[i].getModifiers();[/align]
[align=left] String piv=Modifier. toString(mo);[/align]
System. out .print("父类属性" +piv+"
" + r1.getName()+" " +e[i].getName());
[align=left] System. out .println();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]结果:[/align]
[align=left]本类属性:private java.lang.String name[/align]
[align=left]本类属性:private int age[/align]
[align=left]------------------[/align]
[align=left]父类属性public static final java.lang.String NATIONAL[/align]
[align=left]父类属性public static final java.lang.String AUTHOR[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
相关文章推荐
- Java线程:创建与启动
- Java静态变量块使用案例
- 数据字典生成Java代码
- maven工程下整合spring+mybatis+freemarker
- eclipse基本使用
- Eclipse快捷键与使用技巧总结
- Java基础之线程——派生自Thread类的子类(TryThread)
- Eclipse统计代码行数
- java 时间格式化
- java中的FileFilter接口如何使用
- java面向对象基础小结(二)
- java web 学习 --第一天(Java三级考试)
- struts2的简单的编程步骤
- java beanUtils框架
- Dive into Spring framework -- 了解基本原理(一)
- Java 内部类种类及使用解析【转】
- LOCAL_SHARED_LIBRARIES 与 LOCAL_LDLIBS,LOCAL_LDFLAGS的区别
- 【java】 基本数据类型之间的转换
- Java_io体系之DataInputStream、DataOutputStream简介、走进源码及示例——08
- Java基础知识学习二(数据类型及运算)