Java小白进阶day18(栈和队列、反射、Class)

栈和队列

:先进后出
栈空:使用pop(),push()都抛出EmptyStackException
peek()返回栈顶元素,不弹出
pop()返回栈顶元素并弹出
由Stack实现
System.out.println(stack);打印栈从栈底到栈顶
由LinkedList实现
System.out.println(list);打印从栈顶到栈底

public class Demo3stack {
	public static void main(String[] args) {
		
	}
	static void test1() {
		Stack<String> stack = new Stack<>();
//		System.out.println(stack.peek());// java.util.EmptyStackException
		stack.push("hello");
		stack.push("a");
		stack.push("hjanj");
		System.out.println(stack);
//		System.out.println(stack.peek());//返回栈顶元素,不弹出
//		System.out.println(stack.peek());
		System.out.println(stack.pop());//返回栈顶元素并弹出,空栈抛异常EmptyStackException
		System.out.println(stack);
	}
	static void test2() {
		LinkedList<String> list = new LinkedList<>();
		list.push("hello");
		list.push("a");
		list.push("hjanj");
		System.out.println(list);//与stack声明的完全相反,从栈顶到栈底
		System.out.println(list.pop());
		System.out.println(list);
	}
}

队列:先进先出
offer(e):放入元素
poll():返回队首元素,并抛出
peek():返回栈顶元素,不抛出
若无元素返回null

public class Demo4Queue {
	public static void main(String[] args) {
		LinkedList<String> list = new LinkedList<>();
		System.out.println(list.peek());//队列无元素返回null
		System.out.println(list.poll());//队列无元素返回null
		list.offer("a");
		list.offer("b");
		list.offer("c");
		System.out.println(list.peek());
		System.out.println(list);
		System.out.println(list.poll());
		System.out.println(list);
	}
}

反射

程序运行过程中我们可以获取得类的构造方法,成员变量(包含私有的)方法,对象使用类成员,我们把获取类成员和对象去调用类成员的机制叫做反射

Class类

封装了运行过程中的大量的方法,通过方法可以获取到构造方法,方法,成员变量

public class Demo6Ddc {
	public void qi() {
		System.out.println("兜风!!!");
	}
}
public class Demo6Gjc {
	public void zuo() {
		System.out.println("看风景!!!");
	}
}
public class Demo6 {
	public static void main(String[] args) throws  Exception {
		//都配置文件
		Properties p = new  Properties();
		p.load(new FileInputStream("test.properties"));
		System.out.println(p.getProperty("className"));
		System.out.println(p.getProperty("methodName"));
		String className = p.getProperty("className");
		String methodName = p.getProperty("methodName");
		//获取类的对象
		Class<?> class1 = Class.forName(className);
		Object obj = class1.newInstance();
		Method m = class1.getDeclaredMethod(methodName);
		m.invoke(obj);
	}
}

public class Demo5 {
	//1\获取Class类对象
	public static void test1() throws ClassNotFoundException {
		//通过对象获取
		Class<? extends Demo5test> class1 = new Demo5test().getClass();
		//通过类名获取
		Class<Demo5test> class2 = Demo5test.class;
		System.out.println(class1 == class2 );
		//forName("包名+类名")
		Class class3 = Class.forName("Demo0807.Demo5test");
		System.out.println(class2 == class3);
		System.out.println(class1 == class3);
	}
	//2、获取和使用构造方法
	public static void test2() {
		Class<Demo5test> class1 = Demo5test.class;
		@SuppressWarnings("rawtypes")
		Constructor[] constructs =  class1.getDeclaredConstructors();
		for(Constructor<?> construct:constructs) {
			System.out.println(construct.getModifiers()+"->"+
					Modifier.toString(construct.getModifiers()));
			System.out.println(construct.getName());
			//返回参数列表的class列表的数组
			Class[] pclass = construct.getParameterTypes();
			for(Class c: pclass) {
				System.out.println(c.getName());
			}
			System.out.println("-----------");
		}
	}
	//获取无参的构造方法,创建对象
	public static void test2_1() throws Exception {
		Class<Demo5test> class1 =Demo5test.class;
		
		Constructor<Demo5test> con =  class1.getDeclaredConstructor();
		//得到无参的构造方法对象
//		Demo5test stu = con.newInstance();//new Demo5test();
		
		//使用无参的构造方法创建对象,不用获取Constructor对象,可以使用下面的方式
		
		//直接由Class类型的对象调用
		Demo5test stu = class1.newInstance();
		stu.name ="zhangsan";
		stu.eat("饺子");
		
	}
	//代餐的狗早方法,创建对象
	public static void test2_2() throws Exception{
		Class<Demo5test> class1 = Demo5test.class;
		Constructor<Demo5test> constructor 
			= class1.getDeclaredConstructor(new Class[] {String.class});
		//使用构造方法创建对象
		Demo5test stu =  constructor.newInstance(new Object[] {"李四"}); 
		stu.eat("米饭");
	}
	//私有的带参的构造方法,创建对象
		public static void test2_3() throws Exception{
			Class<Demo5test> class1 = Demo5test.class;
			Constructor<Demo5test> constructor 
				= class1.getDeclaredConstructor(new Class[] {String.class,int.class});
			//使用构造方法创建对象
			constructor.setAccessible(true);//IllegalAccessException:设置后访问属性,可获取
			Demo5test stu =  constructor.newInstance(new Object[] {"李四",18}); //IllegalAccessException:
			stu.eat("米饭");
		}
	
	//3、获取功能方法
		//getDeclaredMethods获取本类的方法
		//getMethods()获取本类和父类的非私有方法
	public static void test3() {
		Class class1 = Demo5test.class;
//		Method[] methods = class1.getDeclaredMethods();
		Method[] methods = class1.getMethods();
		for(Method m :methods) {
			System.out.println(m.getName());
			System.out.println(m.getReturnType());
			System.out.println("----------------");
		}
	}
	
	public static void test3_1() throws Exception {
		Class<Demo5test> class1 = Demo5test.class;
		Demo5test stu = class1.newInstance();
		Method method = class1.getDeclaredMethod("sleep");
		method.invoke(stu);
		Method method1 = class1.getDeclaredMethod("eat",new Class[] {String.class});
		method1.invoke(stu,new Object[] {"mantou"});
//		System.out.println(method1);
		Method method2 = class1.getDeclaredMethod("setAge",new Class[] {int.class});
		method2.setAccessible(true);
		method2.invoke(stu,new Object[] {18});
		Method method3 = class1.getDeclaredMethod("getAge");
		method3.setAccessible(true);
		System.out.println(method3.invoke(stu));
	}
	//获取和使用成员变量
	public static void test4() throws Exception {
		Class<Demo5test> class1 = Demo5test.class;
		Demo5test stu = class1.newInstance();
		Field[] fileds = class1.getDeclaredFields();
		for(Field f:fileds) {
			System.out.println(f.getName());
		}
		Field filed = class1.getDeclaredField("name");
		filed.set(stu, "zhangsan");
		System.out.println(filed.get(stu));
		System.out.println(filed.getType()+":"+filed.getName());
		Field filed1 = class1.getDeclaredField("age");
		filed1.setAccessible(true);
		filed1.set(stu,18);
		System.out.println(filed1.get(stu));
		System.out.println(filed1.getType()+":"+filed1.getName());
	}
	
	
	public static void main (String[] args) throws Exception{
		test4();
	}
}
public class Demo5test {
	public String name;
	private int age;
	public Demo5test() {
		
	}
	public Demo5test(String name ) {
		super();
		this.name = name;
	}
	private Demo5test(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public void eat(String food) {
		System.out.println(name+"吃"+food);
	}
	public void sleep() {
		System.out.println("睡觉");
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	private int getAge() {
		return age;
	}
	private void setAge(int age) {
		this.age = age;
	}
	
	
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值